我已经有人编写了这个脚本,我仔细查看了一下,发现我不确定是安全的:

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

不要问我为什么,这只是脚本的制作方式。

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

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

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

谢谢!

===============>>#1 票数:1

您需要将两个连接都置于可序列化的事务隔离级别中,以通过使用tx_isolation在每个连接上设置tx_isolation来避免描述的情况:

SET @@tx_isolation = SERIALIZABLE;

要么

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

或通过以下方式设置全局隔离级别:

SET @@global.tx_isolation = SERIALIZABLE;

要么

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

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

有关更多详细信息,请参见mysql文档

===============>>#2 票数: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

  ask by teomor translate from so

未解决问题?本站智能推荐:

1回复

该PostgreSQL代码可以创建哪些并发问题?

好的,这是模式,这很容易解释: 我有2笔交易: T1和T2 。 T1将在“伦敦”的任何商店中出售的任何产品的价格提高5%。 对于价格大于等于$ 1050的任何产品, T2会将价格降低10% 我被要求告诉他们它们可能导致哪种并发异常 ,以及应该对哪种事务应用哪种隔离级别以使其
1回复

使用JTA隔离分布式(全局)事务

我们知道隔离和原子性是两个不同的属性。 原子性是“全有或全无”属性,无论是事务成功完成还是完全失败。 JTA和JTA基于的X / Open XA两阶段提交标准完全支持原子性。 我的问题是:JTA是否支持隔离? 我只是指我们使用EJB和JDBC,没有框架(例如Spring)或除JTA之
2回复

MySQL事务隔离级别坏了吗?

我似乎无法在32位x86 Debian上获得MySQL 5.0.32以兑现事务隔离级别。 我已经将问题简化为最简单的形式,使用mysql命令行客户端进行测试: 可能相关,我注意到在回滚后行仍然存在! 所以我的问题是autocommit并没有真正禁用,因此有效地忽略了事务隔离级
1回复

在mysql中通过READ写

我是mysql事务可序列化的新手。 当我尝试在其他并发会话正在读取表的同时更新表的一行时,更新事务必须等待读取的事务完成。 有什么方法可以允许写入事务继续进行(然后读取事务应该无法提交)? 这是我用来验证上述属性的测试: 第一场: 第二场: 我想要的是会话2的更新
1回复

MySQL查询中的竞争条件? 减少库存

库存中的每个项目(库存)都建模为一行。 因此,要减少库存,需要执行以下操作: 这是在事务中完成的。 所以看起来像: 我怀疑比赛条件是可能的。 如果我有大约两个同时运行上述查询,它们都会成功吗?
3回复

Mysql InnoDB从读取行锁定

我已经阅读过mysql文档,也许我只是不明白这一切。 我正在寻找的是读取其他会话的行锁定 。 当行被锁定时,我希望其他会话等到锁被释放。 我不希望其他会话从快照中读取! 他们必须等到发布! 我想得到的是与以下示例完全相同,但对于单行而不是整个表锁: 先感谢您!
1回复

为什么mysql查询需要隔离读未提交的表锁?

有没有办法让mysql查询不对myisam表进行任何锁定? 我的问题似乎是我的Sphinx Search索引器对myisam表之一进行了超过60的锁定,这似乎使更新语句等待要释放的锁,这又使其他查询等待更新语句完成。 索引器使用mysql_use_result并在调用mysql_free
2回复

MySQL Innodb事务并发

我有3张桌子 产品展示 product_id max_products_can_sell max_products_can_sell_to_individual 购买 用户身份 product_id 数量 预约 product_id 用户身
2回复

MySQL事务-项目以相反的顺序插入

我进行交易: 在我的本地计算机上,物品以正确的顺序插入,例如从1日到7日。 但是在生产服务器上,它以相反的顺序插入,例如从7日到1日。 这可能是我需要更改某些设置的可能原因吗? 编辑:这是查询: 项目的顺序应该是从0到任何数字。 例如0-6、0-15 ...
4回复

mysql插入(如果不存在),并发会话

我想在用户表中插入新用户,并确保该表(InnoDB)中尚未存在用户的昵称和电子邮件。 这是我的逻辑: 但是现在我不确定这是否是正确的方法。 假设在SELECT和INSERT之间查询其他并发连接,使用相同的昵称或电子邮件创建新记录(甚至可能吗?)。 然后INSERT将引发异常,而