【发布时间】:2014-12-13 20:50:28
【问题描述】:
当从多个线程或进程对同一个数据库和表进行事务处理时,通常会期望出现以下类型的错误:
超过锁定等待超时;尝试重启事务
来自 MySQL?
我的理解是,这并不表示死锁以及由于昂贵的操作而阻塞的情况。
就我而言,我注意到如下代码结构:
BEGIN
DELETE FROM TableA where pk = X
DELETE FROM TableC where colA = X
DELETE FROM TableD where colA = X
DELETE FROM TableE where colA = X
DELETE FROM TableF where colA = X
COMMIT
为了获得更多上下文,我想从这些表中删除,以便更快,我通过分配批量 PK 而不是通过单个线程顺序执行来分隔多个线程中的删除。
所以基本上据我所知,不会出现死锁(如果我错了,请纠正我)。
所以我认为的问题是其中一个线程在尝试删除时被阻塞了太久。
似乎(也根据错误消息)我需要在应用程序级别处理这种情况。
所以我的问题是:在编写执行事务的代码时,通常需要期待这样的错误,例如等待几秒钟并重试事务几次然后可能放弃?
我不确定这是否是人们通常为交易编码的方式。
(注意:我将其标记为 Java,尽管它不是 Java 问题,因为它是我的首选语言)。
【问题讨论】:
-
有理由不使用外键和级联删除吗?
-
@X.L.Ant:这是当前的设计,我无法更改。我会假设会出现同样的问题,因为级联删除也是“冗长”的操作
-
是的,我同意。只是出于好奇。
标签: java mysql multithreading transactions deadlock