0

我有一个同时调用的方法。在该方法中,我定义了一个事务,其中在方法中传递的参数上发生了一些DELETE操作和操作。SELECT我尝试同时调用此方法并在每个瞬间传递不同的数据。我收到一个错误:

错误 1205:事务(进程 ID)在资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行事务

方法体如下所示:

public void method(param){
  //transaction starts
  // delete operation on table 1
  // select operation on table 1
  // transaction is committed. 
}

假设有事务 T1 和 T2

我认为这种死锁情况不应该发生,因为在这种情况下,行级锁定将基于我在方法中传递的参数应用。如果事务 T2 想要删除其他数据,则事务 T1 不应阻止它删除它。发生的事情是一个事务正在回滚,因为我正在捕捉,SQLException因此只有一条记录被成功删除。谁能弄清楚为什么这不起作用?

4

1 回答 1

0

首先,根据所使用的索引,一些数据库可能会在您认为它们应该使用行级锁时使用表级锁。因此,第 1 步是验证您是否确实在使用行级锁。

其次,您是否使用了任何自动级联,这可能会在您删除时影响其他表?和/或是否涉及外键关系。在这种情况下缺少索引也会导致问题。

第三,由于索引的处理方式,有时更新可能会影响超过 1 行。每当有更新(例如,行删除)时,一些数据库都会锁定索引的“块”。由于索引上的锁,可能存在冲突。

于 2012-12-04T18:00:41.493 回答