源码位置: ClientSession.with_transaction
注意必须主从或者分片集群才能使用事务:分片配置参考文章:https://blog.csdn.net/weixin_34288121/article/details/92905461
最终代码:注意代码里的db_client是MotorDatabase对象,只能是MotorClient对象调用start_session(), 而不是MotorDatabase对象
方法一:需要将session传入目标函数内
async def do_something(session):
await db.collection.insert_one({xxx:xx},session=session)
async def demo():
async with await db_client.client.start_session() as s:
async with s.start_transaction():
result = await do_something(s)
return result
方法二: session自动传入
async def do_something(session):
await db.collection.insert_one({xxx:xx},session=session)
async def demo():
async with await db_client.client.start_session() as s:
return s.start_transaction(do_something)
方法三:直接执行数据库操作
async def demo():
async with await db_client.client.start_session() as s:
orders.insert_one({"sku": "abc123", "qty": 100}, session=session)
运行测试:异常时,数据不会提交