两个事务同时访问同一个表

时间:2012-12-04 17:09:39

标签: java sql-server concurrency transactions

我有一个同时调用的方法。在该方法中,我有一个已定义的事务,其中对方法中传递的参数进行了一些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

我认为不会发生这种死锁情况,因为在这种情况下,将根据方法中传递的参数I应用行级锁定。如果事务T2想要删除其他数据,那么事务T1不应该阻止它删除它。发生的事情是一个事务正在回滚,因为我正在捕获SQLException因此只有一条记录被成功删除。任何人都可以找出为什么这不起作用?

1 个答案:

答案 0 :(得分:0)

首先,根据使用的索引,当您认为应该使用行级锁时,某些数据库可能会使用表级锁。所以,第1步是验证你实际上是在使用行级锁。

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

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