Skip to content

Commit e6fdef4

Browse files
authored
fix(sqlite): autocommit mode transaction handling to match CPython (#5918)
1 parent f0cf9e6 commit e6fdef4

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

Lib/test/test_sqlite3/test_transactions.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@ def test_replace_starts_transaction(self):
9494
self.assertEqual(len(res), 1)
9595
self.assertEqual(res[0][0], 5)
9696

97-
# TODO: RUSTPYTHON
98-
@unittest.expectedFailure
9997
def test_toggle_auto_commit(self):
10098
self.cur1.execute("create table test(i)")
10199
self.cur1.execute("insert into test(i) values (5)")

stdlib/src/sqlite.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,16 @@ mod _sqlite {
13461346
if let Some(val) = &val {
13471347
begin_statement_ptr_from_isolation_level(val, vm)?;
13481348
}
1349+
1350+
// If setting isolation_level to None (auto-commit mode), commit any pending transaction
1351+
if val.is_none() {
1352+
let db = self.db_lock(vm)?;
1353+
if !db.is_autocommit() {
1354+
// Keep the lock and call implicit_commit directly to avoid race conditions
1355+
db.implicit_commit(vm)?;
1356+
}
1357+
}
1358+
13491359
let _ = unsafe { self.isolation_level.swap(val) };
13501360
Ok(())
13511361
}
@@ -1472,7 +1482,10 @@ mod _sqlite {
14721482

14731483
let db = zelf.connection.db_lock(vm)?;
14741484

1475-
if stmt.is_dml && db.is_autocommit() {
1485+
if stmt.is_dml
1486+
&& db.is_autocommit()
1487+
&& zelf.connection.isolation_level.deref().is_some()
1488+
{
14761489
db.begin_transaction(
14771490
zelf.connection
14781491
.isolation_level
@@ -1552,7 +1565,10 @@ mod _sqlite {
15521565

15531566
let db = zelf.connection.db_lock(vm)?;
15541567

1555-
if stmt.is_dml && db.is_autocommit() {
1568+
if stmt.is_dml
1569+
&& db.is_autocommit()
1570+
&& zelf.connection.isolation_level.deref().is_some()
1571+
{
15561572
db.begin_transaction(
15571573
zelf.connection
15581574
.isolation_level

0 commit comments

Comments
 (0)