我有一个Java应用程序,它使用Spring和HikariCP来池MySQL连接。存在高度并发性,线程在单个表中为给定任务创建唯一条目,然后在完成时删除该条目。每次为线程分配任务时,它首先检查表,以查看该任务是否已在运行。它看起来很好用,而且我没有得到任何死锁,但是在应用程序完全退出之后,我注意到我仍然可以看到表中的条目(使用MySQL工作台)。最终,它们都被成功地删除了。隔离级别是READ_COMMITTED,所以我不知道为什么会看到脏读取。
发布于 2016-06-04 21:28:09
(我不能回答你的问题,但也许以下几点可以消除你所看到的问题。)
对于长期运行的任务(超过几秒钟),请考虑以下技术:
SET autocommit=1;
UPDATE Tasks SET owner='me' WHERE task='use_car' AND owner IS NULL;
if ROWS_AFFECTED == 0 THEN
Do something else, or wait, or whatever
START TRANSACTION;
...
COMMIT;
UPDATE Tasks SET owner=NULL WHERE task='use_car';备注:
UPDATE都是原子的,所以一个简单的自动提交就足够了。https://dba.stackexchange.com/questions/139774
复制相似问题