【问题标题】:Why does select ... for UPDATE locks inserts?为什么 select ... for UPDATE 锁定插入?
【发布时间】:2014-09-01 03:51:37
【问题描述】:

我正在运行如下所示的事务:

BEGIN()
SELECT * FROM mytable LIMIT 1
COMMIT()

问题是,如果我尝试同时在mytable 中插入新数据,它需要的时间比通常要长,所以我假设事务锁定mytable 以进行插入。这可能吗?

MySQL 服务器引擎是InnoDB,最新版本

【问题讨论】:

  • MySQL 真的使用commit() 而不是commit
  • 当然,不仅可能而且必不可少。否则,INSERT 可能会插入与 UPDATE 冲突的内容,例如 UPDATE 将复制的键值。

标签: mysql locks


【解决方案1】:

尝试将其添加到查询的顶部:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

默认情况下,它允许查询尝试读取当前插入到表中的数据,从而导致死锁。

使用此标志,它只会在您开始运行查询时设置表中已经存在的值。

【讨论】:

  • 是否可以仅在该表上设置?更改整个数据库的隔离似乎很危险。
  • 不会在数据库级别更改,而是在TRANSACTION级别更改,所以应该没问题。
  • 当我尝试在事务中更改它时,我收到此错误Transaction isolation level can't be changed while a transaction is in progress
  • @hey 我在这里添加了一个小提琴 - sqlfiddle.com/#!3/0b5d4/1 - 脚本不会运行,但这应该是您正在寻找的语法。可以这样试试吗?
  • 好的,现在我明白了。正如我所说,事务级别不应该适用于所有表/数据库吗?(给定您的语法)。我知道它适用于“事务”级别,但我们在不同的表上有很多事务,所以理想情况下,我希望我可以只在特定事务上启用它,而不是在所有事务(也就是整个数据库)上启用它。顺便说一句,小提琴显示了 MSSQL。这个问题被标记为 MySQL,尽管我认为它没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 2014-03-10
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多