CodeWalk

SQLAlchemy事务管理与事务隔离级别详解

作者:小字辈 · 2026-05-30 12:55

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。设置后需注意数据库支持情况。