我只是想知道mysql“SELECT FOR UPDATE”锁会阻止我在一个进程中的所有线程,以及如果我需要在多线程应用程序中授予此锁,如何绕过它。
为了简单起见,我只是在 ruby 中给出了一个简单的测试代码:
t1 = Thread.new do
db = Sequel.connect("mysql://abcd:abcd@localhost:3306/test_db")
db.transaction do
db["select * from tables where id = 1 for update"].first
10.times { |t| p 'babababa' }
end
end
t2 = Thread.new do
db = Sequel.connect("mysql://abcd:abcd@localhost:3306/test_db")
db.transaction do
db["select * from tables where id = 1 for update"].first
10.times { |t| p 'lalalala' }
end
end
t1.join
t2.join
p 'done'
实际上,结果将是:
线程 1 和线程 2 在其中一个线程获得“FOR UPDATE”LOCK 后挂起至少 50 秒(Mysql 设置中的锁定等待时间为 50 秒),然后一个线程引发“超出锁定等待超时”错误并退出,另一个线程成功打印出它的“baba”或“lala”。