在多个并行批处理中运行处理作业,它基本上读取大块行以更新一些行 - 这里可以使用较低的事务级别,因为我知道在此任务运行时不会更新相关值,因此在调用每个存储之前我运行的过程:
set session transaction isolation level read uncommitted
然后调用存储过程,它获取要处理的 ID 子集。整体操作的SQLFiddle:http ://sqlfiddle.com/#!9/192d62 (有点做作但保持原始查询的结构)
我问的原因是死锁继续发生并查看监视器输出,有一个线程请求共享锁,而另一个线程在同一空间上持有排他锁(反之亦然)-不应设置该事务级别来阻止需要对于共享锁?除了 之外,还有其他理由获得共享锁repeatable-read吗?
使用 InnoDB。
相关锁信息来自show engine innodb status(编辑以匹配来自 SQLFiddle 的表名):
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 481628 page no 24944 n bits 112 index `PRIMARY` of table `events` trx id 27740892 lock mode S locks rec but not gap waiting
Run Code Online (Sandbox Code Playgroud)
和
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 481628 page no …Run Code Online (Sandbox Code Playgroud)