我得到了某人制作的这个脚本,我查看了它并发现了一些我不确定是否安全的内容:
在一个事务内,有 2 个连续的插入,位于 2 个不同的表中,两个表都具有自动递增的主键。它们应该是相同的(第一次插入生成的主键 = 第二次插入生成的主键)。
别问我为什么,剧本就是这么写的。
我是事务新手,我不太清楚这里是否存在并发问题。我正在考虑另一个线程同时运行并最终生成如下 key 的可能性:
Thread #1: Table_A ID: 3 Table_B ID: 4
Thread #2: Table_A ID: 4 Table_B ID: 3
我很确定(我今天才第一次准备好与交易相关的文档)交易无法防止这种情况,但我只是想确保我做对了。
谢谢!
最佳答案
您需要将两个连接置于可序列化事务隔离级别,以避免出现您所描述的情况,方法是在每个连接上设置 tx_isolation
:
SET @@tx_isolation = SERIALIZABLE;
或
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
或者通过设置全局隔离级别:
SET @@global.tx_isolation = SERIALIZABLE;
或
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
由任何随后打开的连接继承。在该级别,如果另一个事务已经在进行中,则事务将阻塞任何查询,即。事务已在同一表上发出查询(读或写)。
参见the mysql documentation了解更多详情。
关于MySQL 事务和并发插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041664/