我想锁定一个表,这样当其他线程正在处理这些行集时,其他线程就不能插入任何带有(例如)user_id = 5 的行。 虽然我可以锁定整个表,但这似乎太多并且会减少并发性。
我的线程正在执行以下操作,并且其中有很多线程同时运行。
Start Transaction
1) insert row with user_id=val
2) if (count (*) >= 2) where user_id = val and some other conditions then do "something"
COMMIT
现在,如果 2 个线程并行运行,那么它们可能都会得到 count(*) = 1,但是当它们都提交时,总行数是 2,这应该已经完成了“某事”
我的想法是,我需要在每个事务中锁定 user_id=val 的行,以便在我的事务完成之前没有人可以插入 user_id = val。
有没有办法使用 MySQL 和 Hibernate 来实现这一点。
最佳答案
使用锁定读取。
从表中选择 COUNT(*),其中 user_id = val 用于更新。
将锁定匹配的行直到事务结束。
http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html
关于mysql - 是否可以锁定表以插入所选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402467/