共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。
在实际的业务开发中,数据库操作往往并不是单一的插入或更新,而是多个操作组合在一起形成一个整体。这时候如果其中某一步失败,就可能导致数据不一致。为了解决这个问题,就需要使用事务管理。SQLModel 基于 SQLAlchemy,可以方便地支持事务。
一、事务的基本概念
事务是一组数据库操作,要么全部成功提交,要么全部失败回滚。事务的四大特性简称为 ACID:
- 原子性(Atomicity):事务中的操作不可分割,要么全部完成,要么全部不做。
- 一致性(Consistency):事务执行前后,数据库必须保持一致状态。
- 隔离性(Isolation):多个事务之间互不干扰。
- 持久性(Durability):事务提交后,其结果会永久保存。
二、SQLModel 中的事务用法
使用 Session 对象时,可以通过 commit() 提交事务,或者通过 rollback() 回滚事务。例如:
from sqlmodel import Session
from models import User, engine
with Session(engine) as session:
try:
user1 = User(name="Alice", email="[email protected]")
user2 = User(name="Bob", email="[email protected]")
session.add(user1)
session.add(user2)
# 提交事务
session.commit()
except Exception as e:
# 发生异常时回滚
session.rollback()
print(" 事务失败,已回滚:", e)
三、使用 begin() 自动管理事务
SQLModel 还支持 session.begin(),在 with 语句中会自动提交或回滚事务:
with Session(engine) as session:
with session.begin():
user1 = User(name="Charlie", email="[email protected]")
user2 = User(name="David", email="[email protected]")
session.add(user1)
session.add(user2)
这里,如果在 with 代码块中出现异常,事务会自动回滚;如果执行正常结束,则会自动提交。
四、多个操作组合的事务
在实际开发中,可能需要同时修改多个表。例如:用户下单时,需要写入订单表,同时减少库存表中的数量:
with Session(engine) as session:
try:
with session.begin():
order = Order(user_id=1, product_id=100, quantity=2)
session.add(order)
product = session.get(Product, 100)
product.stock -= 2
session.add(product)
except Exception as e:
print(" 下单失败,事务已回滚:", e)
如果库存不足或写入订单失败,整个事务会回滚,保证了订单和库存的一致性。
五、小结
事务管理是数据库编程中的核心知识点,能有效保证数据的可靠性和一致性。SQLModel 提供了灵活的事务机制,包括手动提交 / 回滚和自动事务控制。在开发中,应当根据场景合理选择事务模式,避免出现“部分成功”的问题。
下一节我们将学习 SQLModel 中的关系映射,深入掌握一对多和多对多的数据建模方法。