提问者:小点点

在MySQL中锁定表,就像在PostgreSQL中一样


我的问题是,我想插入一个新行,其计算值依赖于事务早期执行的选择。但避免并行事务插入相同的计算值。

这个问题应该通过事务隔离级别SERIALIZABLE来避免。

我运行以下步骤:

  1. 交易A:开始;
  2. 交易B:开始;
  3. 事务A:从tableName中选择max(x);
  4. 事务B:从tableName中选择max(x);
  5. TRANSACTION B:插入tableName(x,PK_COLUMN)值(最大1,主要KeyA);
  6. TRANSACTION A:插入tableName(x,PK_COLUMN)值(最大1,主要KeyB);
  7. 交易A:提交;
  8. 交易B:提交;

在此之后,在MySQL中,我有两个具有相同x值的新行,但我希望两个事务中的一个中止。

在PostgreSQL上,我可以执行LOCK TABLE tableNameINSHARE MODE,这会阻止TRANSACTION A执行第6步。在MySQL上,我尝试了http://dev.mysql.com/doc/refman/5.1/de/lock-tables.html中描述的锁定技术,但没有成功。

有什么建议吗?谢谢。


共1个答案

匿名用户

我发现了问题。MySQL工作台不会为每个sql窗口分叉一个新事务……所以我正在使用唯一的事务……使用连接到服务器的两个终端后。一切都按预期工作。