[
https://issues.apache.org/jira/browse/IGNITE-20534?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov updated IGNITE-20534:
--------------------------------------
Description:
It is possible to rollback a transaction, invoke a modification operation on
some table, open another transaction and get 'Failed to acquire a lock due to a
conflict' when accessing that table.
Reproducer:
{code:java}
@Test
public void testLockIsNotReleasedAfterTxRollback() {
Ignite ignite = CLUSTER_NODES.get(0);
IgniteSql sql = ignite.sql();
try (Session ses = ignite.sql().createSession()) {
ses.execute(null, "CREATE TABLE IF NOT EXISTS tst(id INTEGER
PRIMARY KEY, val INTEGER)").affectedRows();
}
try (Session session = sql.createSession()) {
Transaction tx = ignite.transactions().begin();
assertThrows(RuntimeException.class, () -> session.execute(tx,
"SELECT 1/0"));
tx.rollback();
session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); // if this
line is commented out, everything works fine.
}
try (Session session = sql.createSession()) {
Transaction tx = ignite.transactions().begin(new
TransactionOptions().readOnly(false));
session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); //IGN-TX-4
TraceId:20441aa3-c3fb-4900-a78f-b2cb4585e314 Failed to acquire a lock due to a
conflict [txId=018af087-fb6b-0000-0000-0000e9bae05c,
conflictingWaiter=WaiterImpl [txId=018af087-f595-0000-0000-0000e9bae05c,
intendedLockMode=null, lockMode=X, ex=null, isDone=true]]
tx.commit();
}
}
{code}
was:
It is possible to rollback a transaction, invoke a modification operation, open
another transaction and get 'Failed to acquire a lock due to a conflict' when
accessing that table.
Reproducer:
{code:java}
@Test
public void testLockIsNotReleasedAfterTxRollback() {
Ignite ignite = CLUSTER_NODES.get(0);
IgniteSql sql = ignite.sql();
try (Session ses = ignite.sql().createSession()) {
ses.execute(null, "CREATE TABLE IF NOT EXISTS tst(id INTEGER
PRIMARY KEY, val INTEGER)").affectedRows();
}
try (Session session = sql.createSession()) {
Transaction tx = ignite.transactions().begin();
assertThrows(RuntimeException.class, () -> session.execute(tx,
"SELECT 1/0"));
tx.rollback();
session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); // if this
line is commented out, everything works fine.
}
try (Session session = sql.createSession()) {
Transaction tx = ignite.transactions().begin(new
TransactionOptions().readOnly(false));
session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); //IGN-TX-4
TraceId:20441aa3-c3fb-4900-a78f-b2cb4585e314 Failed to acquire a lock due to a
conflict [txId=018af087-fb6b-0000-0000-0000e9bae05c,
conflictingWaiter=WaiterImpl [txId=018af087-f595-0000-0000-0000e9bae05c,
intendedLockMode=null, lockMode=X, ex=null, isDone=true]]
tx.commit();
}
}
{code}
> Transactions. It is possible to call enlist on a rollbacked transaction and
> cause a resource leak.
> --------------------------------------------------------------------------------------------------
>
> Key: IGNITE-20534
> URL: https://issues.apache.org/jira/browse/IGNITE-20534
> Project: Ignite
> Issue Type: Improvement
> Affects Versions: 3.0.0-beta2
> Reporter: Maksim Zhuravkov
> Priority: Major
> Labels: ignite-3
>
> It is possible to rollback a transaction, invoke a modification operation on
> some table, open another transaction and get 'Failed to acquire a lock due to
> a conflict' when accessing that table.
> Reproducer:
> {code:java}
> @Test
> public void testLockIsNotReleasedAfterTxRollback() {
> Ignite ignite = CLUSTER_NODES.get(0);
> IgniteSql sql = ignite.sql();
> try (Session ses = ignite.sql().createSession()) {
> ses.execute(null, "CREATE TABLE IF NOT EXISTS tst(id INTEGER
> PRIMARY KEY, val INTEGER)").affectedRows();
> }
> try (Session session = sql.createSession()) {
> Transaction tx = ignite.transactions().begin();
> assertThrows(RuntimeException.class, () -> session.execute(tx,
> "SELECT 1/0"));
> tx.rollback();
> session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); // if this
> line is commented out, everything works fine.
> }
> try (Session session = sql.createSession()) {
> Transaction tx = ignite.transactions().begin(new
> TransactionOptions().readOnly(false));
> session.execute(tx, "INSERT INTO tst VALUES (1, 1)"); //IGN-TX-4
> TraceId:20441aa3-c3fb-4900-a78f-b2cb4585e314 Failed to acquire a lock due to
> a conflict [txId=018af087-fb6b-0000-0000-0000e9bae05c,
> conflictingWaiter=WaiterImpl [txId=018af087-f595-0000-0000-0000e9bae05c,
> intendedLockMode=null, lockMode=X, ex=null, isDone=true]]
> tx.commit();
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)