SQLAlchemy事务管理与事务隔离级别详解
SQLAlchemy ORM中事务管理是确保数据一致性的关键。请介绍SQLAlchemy中事务的开启提交和回滚(session.begin()/commit()/rollback())、嵌套事务(subtransaction/savepoint)以及四种事务隔离级别的设置方法(READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE)。
回答
小字辈
基础事务管理
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('postgresql://user:pass@localhost/db')
# 方式1:显式事务(推荐)
with Session(engine) as session:
session.begin()
try:
user = User(name='Alice')
session.add(user)
session.commit()
except:
session.rollback()
raise
# 方式2:上下文管理器自动管理
with Session(engine) as session:
with session.begin(): # 自动commit或rollback
session.add(User(name='Bob'))
# 方式3:autocommit模式(不推荐)
session = Session(engine, autocommit=True)
保存点(Savepoint)/嵌套事务
with Session(engine) as session:
with session.begin():
session.add(User(name='Alice'))
# 创建保存点
savepoint = session.begin_nested()
try:
session.add(User(name='Bob'))
savepoint.commit() # 提交保存点内改动
except:
savepoint.rollback() # 回滚到保存点,不影响外层
事务隔离级别设置
from sqlalchemy import create_engine
# 方式1:引擎级别
engine = create_engine(
'postgresql://user:pass@localhost/db',
isolation_level='REPEATABLE READ'
)
# 方式2:连接级别(自动回退到默认)
with engine.connect() as conn:
conn.execution_options(
isolation_level='SERIALIZABLE'
)
# 方式3:Session级别
session = Session(engine)
session.connection(execution_options={
'isolation_level': 'READ COMMITTED'
})
四种隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 |
| READ COMMITTED | ❌ 避免 | ✅ 可能 | ✅ 可能 |
| REPEATABLE READ | ❌ 避免 | ❌ 避免 | ✅ 可能 |
| SERIALIZABLE | ❌ 避免 | ❌ 避免 | ❌ 避免 |
注意:PostgreSQL默认READ COMMITTED,MySQL默认REPEATABLE READ。设置后需注意数据库支持情况。