我有一个同时调用的方法。在该方法中,我有一个已定义的事务,其中对方法中传递的参数进行了一些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
因此只有一条记录被成功删除。任何人都可以找出为什么这不起作用?
答案 0 :(得分:0)
首先,根据使用的索引,当您认为应该使用行级锁时,某些数据库可能会使用表级锁。所以,第1步是验证你实际上是在使用行级锁。
第二,您是否正在使用任何自动级联,当您删除时可能会影响其他表?和/或是否存在外键关系。在这种情况下缺少索引也会导致问题。
第三,由于索引的处理方式,有时更新可能会影响1行以上。一旦存在更新(例如行删除),一些数据库就锁定索引的“块”。由于索引上的锁定,可能会发生冲突。