本文目录导读:

- 使用 SQLAlchemy(最常用)
- 使用 Django ORM
- 使用 psycopg2(原生 PostgreSQL)
- 使用 asyncpg(异步 PostgreSQL)
- 事务隔离级别控制
- 最佳实践建议
- 注意事项
在Python数据API中管理事务,主要取决于你所使用的数据库和ORM/驱动,以下是几种常见场景的管理方式:
使用 SQLAlchemy(最常用)
自动提交模式
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('postgresql://user:pass@localhost/db')
session = Session(engine)
# 自动提交示例
with session.begin():
user = User(name="Alice")
session.add(user)
# 事务会自动提交或回滚
显式提交/回滚
session = Session(engine)
try:
user1 = User(name="Bob")
user2 = User(name="Charlie")
session.add_all([user1, user2])
session.commit() # 提交事务
except Exception as e:
session.rollback() # 回滚事务
raise e
finally:
session.close()
使用 Django ORM
基于装饰器
from django.db import transaction
@transaction.atomic
def create_user_and_profile():
user = User.objects.create(username='alice')
Profile.objects.create(user=user, bio='Hello')
# 如果任一操作失败,整个事务回滚
上下文管理器
def bank_transfer(from_account, to_account, amount):
with transaction.atomic():
from_account.balance -= amount
from_account.save()
to_account.balance += amount
to_account.save()
使用 psycopg2(原生 PostgreSQL)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
try:
conn.autocommit = False # 关闭自动提交
cur = conn.cursor()
cur.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
cur.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
conn.commit() # 正常提交
except Exception as e:
conn.rollback() # 出错回滚
raise e
finally:
conn.close()
使用 asyncpg(异步 PostgreSQL)
import asyncpg
async def transfer_money():
conn = await asyncpg.connect(user='user', password='pass', database='test')
try:
async with conn.transaction():
await conn.execute('UPDATE accounts SET balance = balance - 100 WHERE id = 1')
await conn.execute('UPDATE accounts SET balance = balance + 100 WHERE id = 2')
finally:
await conn.close()
事务隔离级别控制
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
# 设置隔离级别
engine = create_engine(
'postgresql://user:pass@localhost/db',
isolation_level="REPEATABLE READ" # 可选:READ COMMITTED, SERIALIZABLE
)
# 或在使用时设置
with engine.connect() as conn:
conn.execution_options(isolation_level="SERIALIZABLE")
# 执行事务操作
最佳实践建议
事务装饰器封装
from functools import wraps
from sqlalchemy.orm import Session
def transactional(func):
@wraps(func)
def wrapper(session: Session, *args, **kwargs):
try:
result = func(session, *args, **kwargs)
session.commit()
return result
except Exception as e:
session.rollback()
raise e
return wrapper
@transactional
def create_order(session, order_data, user_id):
# 业务逻辑
order = Order(**order_data)
session.add(order)
return order
嵌套事务处理
# SQLAlchemy 的嵌套事务
with session.begin():
# 外层事务
obj1 = MyModel(value=1)
session.add(obj1)
with session.begin_nested(): # savepoint
obj2 = MyModel(value=2)
session.add(obj2)
# 内层回滚不会影响外层
注意事项
- 事务尽量短:长时间占用连接资源
- 合理设置隔离级别:权衡数据一致性与性能
- 异常处理:确保所有路径都有清晰的错误处理
- 连接池管理:避免连接泄漏
- 分布式事务:考虑使用Saga模式或两阶段提交
选择哪种方式取决于你的项目框架、数据库类型和性能需求,对于Flask/FastAPI应用推荐SQLAlchemy+显式事务管理,Django项目使用其内置ORM即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播