这是从这个相关的问题产生的,在这里我想知道如何在一个琐碎的情况下(两个都只在一行上进行操作)强制两个事务按顺序进行。我得到了一个答案– SELECT ... FOR UPDATE
用作两个事务的第一行–但这导致了一个问题:如果从不提交或回滚第一个事务,则第二个事务将被无限期地阻止。该innodb_lock_wait_timeout
变量设置了秒数,在此秒数之后,尝试进行第二次事务的客户端将被告知“对不起,再试一次” ...但是据我所知,他们将再次尝试直到下一个服务器重新启动。所以:
ROLLBACK
如果交易永存,肯定有一种方法可以强制执行?我必须诉诸使用守护程序来杀死此类事务,如果是的话,这样的守护程序将是什么样?- 如果某个连接被交易中
wait_timeout
或interactive_timeout
交易中止,交易是否回滚?有没有办法从控制台进行测试?
澄清度:innodb_lock_wait_timeout
设置事务放弃放弃之前等待释放锁的秒数;我想要的是一种强制释放锁的方法。
更新1:这是一个简单的示例,演示了为什么innodb_lock_wait_timeout
不足以确保第二个事务不会被第一个事务阻止:
START TRANSACTION;
SELECT SLEEP(55);
COMMIT;
使用默认设置innodb_lock_wait_timeout = 50
,此事务在55秒后完成而没有错误。并且,如果您UPDATE
在该SLEEP
行之前添加一个,然后从另一个尝试到SELECT ... FOR UPDATE
同一行的客户端发起第二笔交易,那是第二笔交易超时,而不是睡着的那笔交易。
我正在寻找的是一种方法来结束此笔交易的沉睡。
更新2:为了回应hobodave对上面示例的现实性的担忧,这是另一种情况:DBA连接到实时服务器并运行
START TRANSACTION
SELECT ... FOR UPDATE
第二行锁定了应用程序经常写入的行。然后,DBA被打断并走开,忘记了结束交易。该应用程序停止运行直到该行被解锁。我想尽量减少由于此错误而导致应用程序停滞的时间。
ROLLBACK
花费超过n
几秒钟的时间来完成,我想强制执行第一个事务。有什么办法吗?
MYSQL
没有配置来防止这种情况。由于客户端不负责任,因此服务器挂起是不可接受的。我不难理解您的问题,它是如此重要。