在sqlalchemy中使用 select_for_update 和 transaction 避免脏写,然而并没有效果。
打开 echo=True 看日志如sql.log显示。
source/_posts/zh-CN/SQLAlchemy-dirty-write-problem/sql.log
begin_nested() 产生的 sa_savepoint_1 会交叉
但是在mysql的命令行里面,事务加锁会互斥的
阅读官方文档
https://docs.sqlalchemy.org/en/20/core/connections.html#dbapi-autocommit
https://docs.sqlalchemy.org/en/20/dialects/mysql.html#mysql-isolation-level
应该是事物隔离级别默认被设置为 “auto commit” 了,从而导致 transaction 并不生效。
说来也奇怪,SQLAlchemy可以设置的隔离级别比MySQL多出一个“auto commit”

显式的声明隔离级别
可以看到修改配置后的 save point 会依次执行,而不会交叉
source/_posts/zh-CN/SQLAlchemy-dirty-write-problem/sql2.log