17db96d56Sopenharmony_ci# pysqlite2/test/transactions.py: tests transactions 27db96d56Sopenharmony_ci# 37db96d56Sopenharmony_ci# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de> 47db96d56Sopenharmony_ci# 57db96d56Sopenharmony_ci# This file is part of pysqlite. 67db96d56Sopenharmony_ci# 77db96d56Sopenharmony_ci# This software is provided 'as-is', without any express or implied 87db96d56Sopenharmony_ci# warranty. In no event will the authors be held liable for any damages 97db96d56Sopenharmony_ci# arising from the use of this software. 107db96d56Sopenharmony_ci# 117db96d56Sopenharmony_ci# Permission is granted to anyone to use this software for any purpose, 127db96d56Sopenharmony_ci# including commercial applications, and to alter it and redistribute it 137db96d56Sopenharmony_ci# freely, subject to the following restrictions: 147db96d56Sopenharmony_ci# 157db96d56Sopenharmony_ci# 1. The origin of this software must not be misrepresented; you must not 167db96d56Sopenharmony_ci# claim that you wrote the original software. If you use this software 177db96d56Sopenharmony_ci# in a product, an acknowledgment in the product documentation would be 187db96d56Sopenharmony_ci# appreciated but is not required. 197db96d56Sopenharmony_ci# 2. Altered source versions must be plainly marked as such, and must not be 207db96d56Sopenharmony_ci# misrepresented as being the original software. 217db96d56Sopenharmony_ci# 3. This notice may not be removed or altered from any source distribution. 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ciimport os, unittest 247db96d56Sopenharmony_ciimport sqlite3 as sqlite 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_cifrom test.support import LOOPBACK_TIMEOUT 277db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_cifrom test.test_sqlite3.test_dbapi import memory_database 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ciTIMEOUT = LOOPBACK_TIMEOUT / 10 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciclass TransactionTests(unittest.TestCase): 367db96d56Sopenharmony_ci def setUp(self): 377db96d56Sopenharmony_ci self.con1 = sqlite.connect(TESTFN, timeout=TIMEOUT) 387db96d56Sopenharmony_ci self.cur1 = self.con1.cursor() 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci self.con2 = sqlite.connect(TESTFN, timeout=TIMEOUT) 417db96d56Sopenharmony_ci self.cur2 = self.con2.cursor() 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci def tearDown(self): 447db96d56Sopenharmony_ci try: 457db96d56Sopenharmony_ci self.cur1.close() 467db96d56Sopenharmony_ci self.con1.close() 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci self.cur2.close() 497db96d56Sopenharmony_ci self.con2.close() 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci finally: 527db96d56Sopenharmony_ci unlink(TESTFN) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def test_dml_does_not_auto_commit_before(self): 557db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 567db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 577db96d56Sopenharmony_ci self.cur1.execute("create table test2(j)") 587db96d56Sopenharmony_ci self.cur2.execute("select i from test") 597db96d56Sopenharmony_ci res = self.cur2.fetchall() 607db96d56Sopenharmony_ci self.assertEqual(len(res), 0) 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci def test_insert_starts_transaction(self): 637db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 647db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 657db96d56Sopenharmony_ci self.cur2.execute("select i from test") 667db96d56Sopenharmony_ci res = self.cur2.fetchall() 677db96d56Sopenharmony_ci self.assertEqual(len(res), 0) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci def test_update_starts_transaction(self): 707db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 717db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 727db96d56Sopenharmony_ci self.con1.commit() 737db96d56Sopenharmony_ci self.cur1.execute("update test set i=6") 747db96d56Sopenharmony_ci self.cur2.execute("select i from test") 757db96d56Sopenharmony_ci res = self.cur2.fetchone()[0] 767db96d56Sopenharmony_ci self.assertEqual(res, 5) 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci def test_delete_starts_transaction(self): 797db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 807db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 817db96d56Sopenharmony_ci self.con1.commit() 827db96d56Sopenharmony_ci self.cur1.execute("delete from test") 837db96d56Sopenharmony_ci self.cur2.execute("select i from test") 847db96d56Sopenharmony_ci res = self.cur2.fetchall() 857db96d56Sopenharmony_ci self.assertEqual(len(res), 1) 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci def test_replace_starts_transaction(self): 887db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 897db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 907db96d56Sopenharmony_ci self.con1.commit() 917db96d56Sopenharmony_ci self.cur1.execute("replace into test(i) values (6)") 927db96d56Sopenharmony_ci self.cur2.execute("select i from test") 937db96d56Sopenharmony_ci res = self.cur2.fetchall() 947db96d56Sopenharmony_ci self.assertEqual(len(res), 1) 957db96d56Sopenharmony_ci self.assertEqual(res[0][0], 5) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci def test_toggle_auto_commit(self): 987db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 997db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 1007db96d56Sopenharmony_ci self.con1.isolation_level = None 1017db96d56Sopenharmony_ci self.assertEqual(self.con1.isolation_level, None) 1027db96d56Sopenharmony_ci self.cur2.execute("select i from test") 1037db96d56Sopenharmony_ci res = self.cur2.fetchall() 1047db96d56Sopenharmony_ci self.assertEqual(len(res), 1) 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci self.con1.isolation_level = "DEFERRED" 1077db96d56Sopenharmony_ci self.assertEqual(self.con1.isolation_level , "DEFERRED") 1087db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 1097db96d56Sopenharmony_ci self.cur2.execute("select i from test") 1107db96d56Sopenharmony_ci res = self.cur2.fetchall() 1117db96d56Sopenharmony_ci self.assertEqual(len(res), 1) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci def test_raise_timeout(self): 1147db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 1157db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 1167db96d56Sopenharmony_ci with self.assertRaises(sqlite.OperationalError): 1177db96d56Sopenharmony_ci self.cur2.execute("insert into test(i) values (5)") 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci def test_locking(self): 1207db96d56Sopenharmony_ci """ 1217db96d56Sopenharmony_ci This tests the improved concurrency with pysqlite 2.3.4. You needed 1227db96d56Sopenharmony_ci to roll back con2 before you could commit con1. 1237db96d56Sopenharmony_ci """ 1247db96d56Sopenharmony_ci self.cur1.execute("create table test(i)") 1257db96d56Sopenharmony_ci self.cur1.execute("insert into test(i) values (5)") 1267db96d56Sopenharmony_ci with self.assertRaises(sqlite.OperationalError): 1277db96d56Sopenharmony_ci self.cur2.execute("insert into test(i) values (5)") 1287db96d56Sopenharmony_ci # NO self.con2.rollback() HERE!!! 1297db96d56Sopenharmony_ci self.con1.commit() 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def test_rollback_cursor_consistency(self): 1327db96d56Sopenharmony_ci """Check that cursors behave correctly after rollback.""" 1337db96d56Sopenharmony_ci con = sqlite.connect(":memory:") 1347db96d56Sopenharmony_ci cur = con.cursor() 1357db96d56Sopenharmony_ci cur.execute("create table test(x)") 1367db96d56Sopenharmony_ci cur.execute("insert into test(x) values (5)") 1377db96d56Sopenharmony_ci cur.execute("select 1 union select 2 union select 3") 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci con.rollback() 1407db96d56Sopenharmony_ci self.assertEqual(cur.fetchall(), [(1,), (2,), (3,)]) 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci def test_multiple_cursors_and_iternext(self): 1437db96d56Sopenharmony_ci # gh-94028: statements are cleared and reset in cursor iternext. 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci # Provoke the gh-94028 by using a cursor cache. 1467db96d56Sopenharmony_ci CURSORS = {} 1477db96d56Sopenharmony_ci def sql(cx, sql, *args): 1487db96d56Sopenharmony_ci cu = cx.cursor() 1497db96d56Sopenharmony_ci cu.execute(sql, args) 1507db96d56Sopenharmony_ci CURSORS[id(sql)] = cu 1517db96d56Sopenharmony_ci return cu 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci self.con1.execute("create table t(t)") 1547db96d56Sopenharmony_ci sql(self.con1, "insert into t values (?), (?), (?)", "u1", "u2", "u3") 1557db96d56Sopenharmony_ci self.con1.commit() 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci # On second connection, verify rows are visible, then delete them. 1587db96d56Sopenharmony_ci count = sql(self.con2, "select count(*) from t").fetchone()[0] 1597db96d56Sopenharmony_ci self.assertEqual(count, 3) 1607db96d56Sopenharmony_ci changes = sql(self.con2, "delete from t").rowcount 1617db96d56Sopenharmony_ci self.assertEqual(changes, 3) 1627db96d56Sopenharmony_ci self.con2.commit() 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci # Back in original connection, create 2 new users. 1657db96d56Sopenharmony_ci sql(self.con1, "insert into t values (?)", "u4") 1667db96d56Sopenharmony_ci sql(self.con1, "insert into t values (?)", "u5") 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci # The second connection cannot see uncommitted changes. 1697db96d56Sopenharmony_ci count = sql(self.con2, "select count(*) from t").fetchone()[0] 1707db96d56Sopenharmony_ci self.assertEqual(count, 0) 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci # First connection can see its own changes. 1737db96d56Sopenharmony_ci count = sql(self.con1, "select count(*) from t").fetchone()[0] 1747db96d56Sopenharmony_ci self.assertEqual(count, 2) 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci # The second connection can now see the changes. 1777db96d56Sopenharmony_ci self.con1.commit() 1787db96d56Sopenharmony_ci count = sql(self.con2, "select count(*) from t").fetchone()[0] 1797db96d56Sopenharmony_ci self.assertEqual(count, 2) 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ciclass RollbackTests(unittest.TestCase): 1837db96d56Sopenharmony_ci """bpo-44092: sqlite3 now leaves it to SQLite to resolve rollback issues""" 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci def setUp(self): 1867db96d56Sopenharmony_ci self.con = sqlite.connect(":memory:") 1877db96d56Sopenharmony_ci self.cur1 = self.con.cursor() 1887db96d56Sopenharmony_ci self.cur2 = self.con.cursor() 1897db96d56Sopenharmony_ci with self.con: 1907db96d56Sopenharmony_ci self.con.execute("create table t(c)"); 1917db96d56Sopenharmony_ci self.con.executemany("insert into t values(?)", [(0,), (1,), (2,)]) 1927db96d56Sopenharmony_ci self.cur1.execute("begin transaction") 1937db96d56Sopenharmony_ci select = "select c from t" 1947db96d56Sopenharmony_ci self.cur1.execute(select) 1957db96d56Sopenharmony_ci self.con.rollback() 1967db96d56Sopenharmony_ci self.res = self.cur2.execute(select) # Reusing stmt from cache 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci def tearDown(self): 1997db96d56Sopenharmony_ci self.con.close() 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci def _check_rows(self): 2027db96d56Sopenharmony_ci for i, row in enumerate(self.res): 2037db96d56Sopenharmony_ci self.assertEqual(row[0], i) 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci def test_no_duplicate_rows_after_rollback_del_cursor(self): 2067db96d56Sopenharmony_ci del self.cur1 2077db96d56Sopenharmony_ci self._check_rows() 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci def test_no_duplicate_rows_after_rollback_close_cursor(self): 2107db96d56Sopenharmony_ci self.cur1.close() 2117db96d56Sopenharmony_ci self._check_rows() 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci def test_no_duplicate_rows_after_rollback_new_query(self): 2147db96d56Sopenharmony_ci self.cur1.execute("select c from t where c = 1") 2157db96d56Sopenharmony_ci self._check_rows() 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ciclass SpecialCommandTests(unittest.TestCase): 2207db96d56Sopenharmony_ci def setUp(self): 2217db96d56Sopenharmony_ci self.con = sqlite.connect(":memory:") 2227db96d56Sopenharmony_ci self.cur = self.con.cursor() 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci def test_drop_table(self): 2257db96d56Sopenharmony_ci self.cur.execute("create table test(i)") 2267db96d56Sopenharmony_ci self.cur.execute("insert into test(i) values (5)") 2277db96d56Sopenharmony_ci self.cur.execute("drop table test") 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci def test_pragma(self): 2307db96d56Sopenharmony_ci self.cur.execute("create table test(i)") 2317db96d56Sopenharmony_ci self.cur.execute("insert into test(i) values (5)") 2327db96d56Sopenharmony_ci self.cur.execute("pragma count_changes=1") 2337db96d56Sopenharmony_ci 2347db96d56Sopenharmony_ci def tearDown(self): 2357db96d56Sopenharmony_ci self.cur.close() 2367db96d56Sopenharmony_ci self.con.close() 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ciclass TransactionalDDL(unittest.TestCase): 2407db96d56Sopenharmony_ci def setUp(self): 2417db96d56Sopenharmony_ci self.con = sqlite.connect(":memory:") 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci def test_ddl_does_not_autostart_transaction(self): 2447db96d56Sopenharmony_ci # For backwards compatibility reasons, DDL statements should not 2457db96d56Sopenharmony_ci # implicitly start a transaction. 2467db96d56Sopenharmony_ci self.con.execute("create table test(i)") 2477db96d56Sopenharmony_ci self.con.rollback() 2487db96d56Sopenharmony_ci result = self.con.execute("select * from test").fetchall() 2497db96d56Sopenharmony_ci self.assertEqual(result, []) 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci def test_immediate_transactional_ddl(self): 2527db96d56Sopenharmony_ci # You can achieve transactional DDL by issuing a BEGIN 2537db96d56Sopenharmony_ci # statement manually. 2547db96d56Sopenharmony_ci self.con.execute("begin immediate") 2557db96d56Sopenharmony_ci self.con.execute("create table test(i)") 2567db96d56Sopenharmony_ci self.con.rollback() 2577db96d56Sopenharmony_ci with self.assertRaises(sqlite.OperationalError): 2587db96d56Sopenharmony_ci self.con.execute("select * from test") 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci def test_transactional_ddl(self): 2617db96d56Sopenharmony_ci # You can achieve transactional DDL by issuing a BEGIN 2627db96d56Sopenharmony_ci # statement manually. 2637db96d56Sopenharmony_ci self.con.execute("begin") 2647db96d56Sopenharmony_ci self.con.execute("create table test(i)") 2657db96d56Sopenharmony_ci self.con.rollback() 2667db96d56Sopenharmony_ci with self.assertRaises(sqlite.OperationalError): 2677db96d56Sopenharmony_ci self.con.execute("select * from test") 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci def tearDown(self): 2707db96d56Sopenharmony_ci self.con.close() 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ciclass IsolationLevelFromInit(unittest.TestCase): 2747db96d56Sopenharmony_ci CREATE = "create table t(t)" 2757db96d56Sopenharmony_ci INSERT = "insert into t values(1)" 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci def setUp(self): 2787db96d56Sopenharmony_ci self.traced = [] 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci def _run_test(self, cx): 2817db96d56Sopenharmony_ci cx.execute(self.CREATE) 2827db96d56Sopenharmony_ci cx.set_trace_callback(lambda stmt: self.traced.append(stmt)) 2837db96d56Sopenharmony_ci with cx: 2847db96d56Sopenharmony_ci cx.execute(self.INSERT) 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci def test_isolation_level_default(self): 2877db96d56Sopenharmony_ci with memory_database() as cx: 2887db96d56Sopenharmony_ci self._run_test(cx) 2897db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"]) 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci def test_isolation_level_begin(self): 2927db96d56Sopenharmony_ci with memory_database(isolation_level="") as cx: 2937db96d56Sopenharmony_ci self._run_test(cx) 2947db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"]) 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci def test_isolation_level_deferred(self): 2977db96d56Sopenharmony_ci with memory_database(isolation_level="DEFERRED") as cx: 2987db96d56Sopenharmony_ci self._run_test(cx) 2997db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN DEFERRED", self.INSERT, "COMMIT"]) 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci def test_isolation_level_immediate(self): 3027db96d56Sopenharmony_ci with memory_database(isolation_level="IMMEDIATE") as cx: 3037db96d56Sopenharmony_ci self._run_test(cx) 3047db96d56Sopenharmony_ci self.assertEqual(self.traced, 3057db96d56Sopenharmony_ci ["BEGIN IMMEDIATE", self.INSERT, "COMMIT"]) 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci def test_isolation_level_exclusive(self): 3087db96d56Sopenharmony_ci with memory_database(isolation_level="EXCLUSIVE") as cx: 3097db96d56Sopenharmony_ci self._run_test(cx) 3107db96d56Sopenharmony_ci self.assertEqual(self.traced, 3117db96d56Sopenharmony_ci ["BEGIN EXCLUSIVE", self.INSERT, "COMMIT"]) 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci def test_isolation_level_none(self): 3147db96d56Sopenharmony_ci with memory_database(isolation_level=None) as cx: 3157db96d56Sopenharmony_ci self._run_test(cx) 3167db96d56Sopenharmony_ci self.assertEqual(self.traced, [self.INSERT]) 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ciclass IsolationLevelPostInit(unittest.TestCase): 3207db96d56Sopenharmony_ci QUERY = "insert into t values(1)" 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci def setUp(self): 3237db96d56Sopenharmony_ci self.cx = sqlite.connect(":memory:") 3247db96d56Sopenharmony_ci self.cx.execute("create table t(t)") 3257db96d56Sopenharmony_ci self.traced = [] 3267db96d56Sopenharmony_ci self.cx.set_trace_callback(lambda stmt: self.traced.append(stmt)) 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci def tearDown(self): 3297db96d56Sopenharmony_ci self.cx.close() 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci def test_isolation_level_default(self): 3327db96d56Sopenharmony_ci with self.cx: 3337db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3347db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"]) 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci def test_isolation_level_begin(self): 3377db96d56Sopenharmony_ci self.cx.isolation_level = "" 3387db96d56Sopenharmony_ci with self.cx: 3397db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3407db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"]) 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci def test_isolation_level_deferrred(self): 3437db96d56Sopenharmony_ci self.cx.isolation_level = "DEFERRED" 3447db96d56Sopenharmony_ci with self.cx: 3457db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3467db96d56Sopenharmony_ci self.assertEqual(self.traced, ["BEGIN DEFERRED", self.QUERY, "COMMIT"]) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def test_isolation_level_immediate(self): 3497db96d56Sopenharmony_ci self.cx.isolation_level = "IMMEDIATE" 3507db96d56Sopenharmony_ci with self.cx: 3517db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3527db96d56Sopenharmony_ci self.assertEqual(self.traced, 3537db96d56Sopenharmony_ci ["BEGIN IMMEDIATE", self.QUERY, "COMMIT"]) 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_ci def test_isolation_level_exclusive(self): 3567db96d56Sopenharmony_ci self.cx.isolation_level = "EXCLUSIVE" 3577db96d56Sopenharmony_ci with self.cx: 3587db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3597db96d56Sopenharmony_ci self.assertEqual(self.traced, 3607db96d56Sopenharmony_ci ["BEGIN EXCLUSIVE", self.QUERY, "COMMIT"]) 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci def test_isolation_level_none(self): 3637db96d56Sopenharmony_ci self.cx.isolation_level = None 3647db96d56Sopenharmony_ci with self.cx: 3657db96d56Sopenharmony_ci self.cx.execute(self.QUERY) 3667db96d56Sopenharmony_ci self.assertEqual(self.traced, [self.QUERY]) 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ciif __name__ == "__main__": 3707db96d56Sopenharmony_ci unittest.main() 371