MariaDB事务已提交但未持久化问题求助
各位大佬,我碰到一个棘手的问题,想请教下大家:
我现在用的是Plesk服务器,上面跑着WordPress/WooCommerce站点,数据库是MariaDB。因为Woocommerce API速度太慢,有时候要处理25k+产品的元数据,所以我写了一些基于sqlalchemy/pymysql的Python脚本,直接操作数据库来更新产品信息。
现在问题来了:
我在单个事务里只更新了某一个产品的一个postmeta字段,并且显式调用了commit(),返回结果显示成功更新1行,没有任何报错。
然后我去查数据库的审计日志,看到了这些操作记录:
8803221 Query SELECT meta_id, meta_value FROM wp_postmeta WHERE post_id = 1113875 AND meta_key = '_stock'
8803221 Query SELECT meta_id, meta_value FROM wp_postmeta WHERE post_id = 1113875 AND meta_key = '_stock_status'
8803221 Query UPDATE wp_postmeta SET meta_value = 'outofstock' WHERE post_id = 1113875 AND meta_key = '_stock_status'
8803221 Query SELECT meta_id, meta_value FROM wp_postmeta WHERE post_id = 1113875 AND meta_key = '_lieferzeit'
8803221 Query SELECT meta_id, meta_value FROM wp_postmeta WHERE post_id = 1113875 AND meta_key = '_manage_stock'
8803221 Query SELECT meta_id, meta_value FROM wp_postmeta WHERE post_id = 1113875 AND meta_key = '_backorders'
8803221 Query COMMIT
8803221 Query ROLLBACK
能看到COMMIT之后跟着一条ROLLBACK,我猜这个ROLLBACK是sqlalchemy在事务完成后清理会话用的,而且是在COMMIT之后执行的,按道理不该影响之前的提交结果才对。
但我直接去查数据库的时候发现,UPDATE的内容根本没生效,还是原来的旧值。有意思的是,如果我手动执行这条UPDATE语句,马上就能生效。
我已经做了这些排查:
- 用纯pymysql执行,结果一样
- 用sqlalchemy执行,问题依旧
- 反复核对了代码和SQL语句
- 检查了MariaDB的审计日志和通用日志
- 执行了
mysql_upgrade --force
有没有大佬遇到过类似的情况?到底是哪里出问题了?
备注:内容来源于stack exchange,提问作者iwilltry42

