0

我得到了某人制作的这个脚本,我查看了它,发现了一些我不确定是否安全的东西:

在事务内部有 2 个连续插入,在 2 个不同的表中,都具有自动递增的主键。它们应该是相同的(第一次插入生成的主键 = 第二次插入生成的主键)。

别问我为什么,剧本就是这么写的。

我是交易新手,我不太清楚这里是否存在并发问题。我正在考虑另一个线程同时运行并最终生成密钥的可能性,例如:

Thread #1:    Table_A ID: 3                                        Table_B ID: 4
Thread #2:                      Table_A ID: 4     Table_B ID: 3

我很确定(我今天才第一次准备好与交易相关的文档)交易不会防止这种情况发生,但我只是想确保我做对了。

谢谢!

4

2 回答 2

1

您需要将两个连接都置于可序列化事务隔离级别,以避免您描述的场景,或者通过tx_isolation在每个连接上设置:

SET @@tx_isolation = SERIALIZABLE;

或者

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

或者通过设置全局隔离级别:

SET @@global.tx_isolation = SERIALIZABLE;

或者

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

它由任何随后打开的连接继承。在那个级别,如果另一个事务已经在进行中,事务将阻塞任何查询,即。事务已经在同一个表上发出查询(读或写)。

有关详细信息,请参阅mysql 文档

于 2013-04-18T13:31:32.570 回答
0

您的情况绝对是可能的。

如果两个表中的主键应该相同,您可以覆盖AUTO_INCREMENT第二个表中的主键并显式插入值:

INSERT
INTO    a (id)
VALUES  (NULL) -- this inserts an auto incremented value

INSERT
INTO    b (id)
SELECT  LAST_INSERT_ID() -- this inserts the last value inserted into a in this session
于 2013-04-16T16:05:38.467 回答