用acoount表学习事务。Bob向Rose转账100元,正常提交状态观察两个账户的余额是否正确。然后异常模拟,当Bob转账后,余额减少了,这时发生异常。观察最后的结果是否正常写出代码
时间: 2024-03-07 14:47:42 浏览: 19
好的,以下是针对您的问题的示例代码,使用了Python的SQLite3模块和with语句来处理事务:
```python
import sqlite3
# 创建account表
conn = sqlite3.connect('test.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS account
(id INTEGER PRIMARY KEY, name TEXT, balance INTEGER)''')
# 插入两个账户
c.execute("INSERT INTO account (name, balance) VALUES (?, ?)", ('Bob', 1000))
c.execute("INSERT INTO account (name, balance) VALUES (?, ?)", ('Rose', 0))
conn.commit()
# 定义转账函数
def transfer_money(from_account, to_account, amount):
with conn:
# 开启事务
conn.execute("BEGIN TRANSACTION")
# 查询余额
c.execute("SELECT balance FROM account WHERE name = ?", (from_account,))
from_balance = c.fetchone()[0]
if from_balance < amount:
# 回滚事务
conn.execute("ROLLBACK TRANSACTION")
print("Not enough balance!")
return
c.execute("SELECT balance FROM account WHERE name = ?", (to_account,))
to_balance = c.fetchone()[0]
# 更新余额
conn.execute("UPDATE account SET balance = ? WHERE name = ?", (from_balance - amount, from_account))
conn.execute("UPDATE account SET balance = ? WHERE name = ?", (to_balance + amount, to_account))
# 提交事务
conn.execute("COMMIT TRANSACTION")
# 正常转账
transfer_money('Bob', 'Rose', 100)
c.execute("SELECT balance FROM account WHERE name = 'Bob'")
print("Bob's balance:", c.fetchone()[0])
c.execute("SELECT balance FROM account WHERE name = 'Rose'")
print("Rose's balance:", c.fetchone()[0])
# 异常模拟
try:
transfer_money('Bob', 'Rose', 1000)
except:
pass
c.execute("SELECT balance FROM account WHERE name = 'Bob'")
print("Bob's balance:", c.fetchone()[0])
c.execute("SELECT balance FROM account WHERE name = 'Rose'")
print("Rose's balance:", c.fetchone()[0])
# 关闭连接
conn.close()
```
在上面的代码中,我们首先创建了一个名为account的表,并向表中插入了两个账户Bob和Rose,然后定义了一个名为transfer_money的函数,用于执行转账操作。在函数中,我们首先开启了一个事务,然后查询了Bob和Rose的余额,如果Bob的余额不足,则回滚事务,否则更新两个账户的余额,并提交事务。在正常转账和异常模拟后,我们分别查询了Bob和Rose的余额,以确保事务处理的正确性。
请注意,上述代码示例仅供参考,实际使用时需要根据具体的情况进行修改。
相关推荐
![sql](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)