[
https://issues.apache.org/jira/browse/DERBY-3961?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mike Matrigali resolved DERBY-3961.
-----------------------------------
Resolution: Duplicate
Fix Version/s: 10.5.1.2
> Deadlock detection fails for InternalTransaction
> ------------------------------------------------
>
> Key: DERBY-3961
> URL: https://issues.apache.org/jira/browse/DERBY-3961
> Project: Derby
> Issue Type: Bug
> Affects Versions: 10.4.2.0
> Environment: Windows Vista
> Reporter: Jeff Stuckman
> Fix For: 10.5.1.2
>
>
> It is easy to cause a deadlock which is not detected by the deadlock
> detection algorithm. The transactions fail due to a lock timeout , possibly
> because a transaction of type InternalTransaction is part of the cycle.
> Resolving issue DERBY-2991 will make it more difficult to cause such
> deadlocks, but it will still be possible.
> My test case creates two threads and executes the following statements until
> they deadlock against each other:
> UPDATE urls SET jobflag=? WHERE urlid=?
> SELECT urlid,url,expectation FROM urls WHERE site=?
> The test eventually deadlocks with the following transaction and lock table
> contents:
> XID TYPE MODE TABLENAME LOCKNAME STATE TABLETYPE LOCKCOUNT INDEXNAME
> 2217109 ROW S URLS (13,1) GRANT T 1 FINDURLBYSITEANDJOB
> 2217114 ROW X URLS (13,1) WAIT T 0 FINDURLBYSITEANDJOB
> 2217113 ROW S URLS (15,1) GRANT T 1 FINDURLBYSITEANDJOB
> 2217113 ROW X URLS (3,132) GRANT T 3 null
> 2217109 ROW S URLS (3,132) WAIT T 0 null
> 2217109 TABLE IS URLS Tablelock GRANT T 2 null
> 2217113 TABLE IX URLS Tablelock GRANT T 4 null
> 2217114 TABLE IX URLS Tablelock GRANT T 1 null
> 2217113 ROW S URLS (6,1) GRANT T 1 SQL081111021116970
> XID GLOBAL_XID USERNAME TYPE STATUS FIRST_INSTANT
> SQL_TEXT
> 2217115 null APP UserTransaction IDLE null select * from
> SYSCS_DIAG.TRANSACTION_TABLE
> 2217114 null APP InternalTransaction ACTIVE null UPDATE urls
> SET jobflag=? WHERE urlid=?
> 2217113 null APP UserTransaction ACTIVE (526,52925) UPDATE
> urls SET jobflag=? WHERE urlid=?
> 2069160 null null SystemTransaction IDLE null null
> 2217109 null APP UserTransaction ACTIVE null SELECT
> urlid,url,expectation FROM urls WHERE site=?
> Here is what I think is happening:
> 1. The SELECT statement begins to execute and the cursor is stepping through
> the result set. The results are derived from index FINDURLBYSITEANDJOB as
> expected.
> 2. The UPDATE statement begins to execute. The row to be updated is the row
> immediately after the SELECT statement's cursor. The row is locked and
> updated.
> 3. The UPDATE statement must perform index maintenance (tree rebalancing or
> similar?). This apparently causes an InternalTransaction to be created. It
> then must lock the row that the SELECT statement's cursor is currently
> occupying. It cannot do this, so the transaction waits.
> 4. The SELECT statement is ready to advance the cursor. However, it cannot
> advance the cursor because the UPDATE statement has locked the next row. The
> transaction waits.
> The result: Transaction 2217113 waits for the "nested transaction" 2217114 to
> complete. 2217114 waits for 2217109 to release its lock. 2217109 waits for
> 2217113 to release its lock. We have a cycle and a deadlock. The transactions
> time out with "A lock could not be obtained within the time requested",
> apparently because the dependency between transactions 2217113 and 2217114 is
> not detected.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.