2012-12-04 27 views
0

我有一个同时调用的方法。在该方法中,我定义了一个事务,其中一些DELETE操作和SELECT操作正在对方法中传递的参数进行。我尝试同时调用此方法并在每个时刻传递不同的数据。我得到一个错误:同时访问同一个表的两笔交易

Error 1205 : Transaction (Process ID) was deadlocked on resources with another process and has been chosen as the deadlock victim. Rerun the transaction

方法的身体看起来是这样的:

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

要有事务T1和T2

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

+0

您正在使用哪种RDBMS? –

+0

这里使用java的并发机制是不可接受的吗? - ''synchronized' – lynks

+0

hi Erkan我正在使用Microsoft SQL Server – Naman

回答

0

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

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

第三,由于如何处理索引,有时更新可能会影响多于一行。一旦有更新(例如行删除),某些数据库会锁定索引的“块”。由于索引上的锁定,可能会有冲突。

+0

以及我试图删除记录的表正在使用其他表的主键作为外键。这是否会造成问题?这里没有涉及级联逻辑。 – Naman

+0

@Naman - 是否索引了外键?我依稀记得甲骨文的问题,如果外键字段没有索引,你会得到表级锁(或类似的东西)。 – jtahlborn

+0

这里我使用的是Microsoft SQL Server ... – Naman

相关问题