mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-31 02:27:06 -04:00 
			
		
		
		
	[fix] sqlitedb: DB connector -- unset isolation_level
A Connection object can be used as a context manager that automatically commits or rolls back open transactions when leaving the body of the context manager. If the connection attribute ``isolation_level`` is **not** ``None``, new transactions are implicitly opened before ``execute()`` and ``executemany()`` executes SQL- INSERT, UPDATE, DELETE, or REPLACE statements [1]. The old implementation set ``isolation_level`` to ``None`` and thereby prevented the context manager from opening and closing the transaction scopes. [1] https://docs.python.org/3/library/sqlite3.html#sqlite3-transaction-control-isolation-level [2] https://github.com/searxng/searxng/pull/5239#discussion_r2381416731 Reported-by: Ivan G <igabaldon@inetol.net> [2] Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
		
							parent
							
								
									18a58943cc
								
							
						
					
					
						commit
						2f0d96b8bc
					
				| @ -127,14 +127,19 @@ class SQLiteAppl(abc.ABC): | |||||||
|         "check_same_thread": bool(SQLITE_THREADING_MODE != "serialized"), |         "check_same_thread": bool(SQLITE_THREADING_MODE != "serialized"), | ||||||
|         "cached_statements": 0,  # https://github.com/python/cpython/issues/118172 |         "cached_statements": 0,  # https://github.com/python/cpython/issues/118172 | ||||||
|         # "uri": False, |         # "uri": False, | ||||||
|         "isolation_level": None, |         # "isolation_level": "", | ||||||
|  |         # "autocommit": sqlite3.LEGACY_TRANSACTION_CONTROL, | ||||||
|     }  # fmt:skip |     }  # fmt:skip | ||||||
|     """Connection arguments (:py:obj:`sqlite3.connect`) |     """Connection arguments (:py:obj:`sqlite3.connect`) | ||||||
| 
 | 
 | ||||||
|     ``check_same_thread``: |     ``check_same_thread``: *bool* | ||||||
|       Is disabled by default when :py:obj:`SQLITE_THREADING_MODE` is |       Is disabled by default when :py:obj:`SQLITE_THREADING_MODE` is | ||||||
|       ``serialized``.  The check is more of a hindrance in this case because it |       `serialized`.  The check is more of a hindrance when threadsafety_ is | ||||||
|       would prevent a DB connector from being used in multiple threads. |       `serialized` because it would prevent a DB connector from being used in | ||||||
|  |       multiple threads. | ||||||
|  | 
 | ||||||
|  |       Is enabled when threadsafety_ is ``single-thread`` or ``multi-thread`` | ||||||
|  |       (when threads cannot share a connection PEP-0249_). | ||||||
| 
 | 
 | ||||||
|     ``cached_statements``: |     ``cached_statements``: | ||||||
|       Is set to ``0`` by default.  Note: Python 3.12+ fetch result are not |       Is set to ``0`` by default.  Note: Python 3.12+ fetch result are not | ||||||
| @ -149,6 +154,40 @@ class SQLiteAppl(abc.ABC): | |||||||
| 
 | 
 | ||||||
|       The workaround for SQLite3 multithreading cache inconsistency is to set |       The workaround for SQLite3 multithreading cache inconsistency is to set | ||||||
|       option ``cached_statements`` to ``0`` by default. |       option ``cached_statements`` to ``0`` by default. | ||||||
|  | 
 | ||||||
|  |     ``isolation_level``: *unset* | ||||||
|  |       If the connection attribute isolation_level_ is **not** ``None``, new | ||||||
|  |       transactions are implicitly opened before ``execute()`` and | ||||||
|  |       ``executemany()`` executes SQL- INSERT, UPDATE, DELETE, or REPLACE | ||||||
|  |       statements `[1]`_. | ||||||
|  | 
 | ||||||
|  |       By default, the value is not set, which means the default from Python is | ||||||
|  |       used: Python's default is ``""``, which is an alias for ``"DEFERRED"``. | ||||||
|  | 
 | ||||||
|  |     ``autocommit``: *unset* | ||||||
|  |       Starting with Python 3.12 the DB connection has a ``autocommit`` attribute | ||||||
|  |       and the recommended way of controlling transaction behaviour is through | ||||||
|  |       this attribute `[2]`_. | ||||||
|  | 
 | ||||||
|  |       By default, the value is not set, which means the default from Python is | ||||||
|  |       used: Python's default is the constant LEGACY_TRANSACTION_CONTROL_: | ||||||
|  |       Pre-Python 3.12 (non-PEP 249-compliant) transaction control, see | ||||||
|  |       ``isolation_level`` above for more details. | ||||||
|  | 
 | ||||||
|  |     .. _PEP-0249: | ||||||
|  |         https://peps.python.org/pep-0249/#threadsafety | ||||||
|  |     .. _threadsafety: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#sqlite3.threadsafety | ||||||
|  |     .. _isolation_level: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.isolation_level | ||||||
|  |     .. _[1]: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#sqlite3-transaction-control-isolation-level | ||||||
|  |     .. _autocommit: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.autocommit | ||||||
|  |     .. _[2]: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#transaction-control-via-the-autocommit-attribute | ||||||
|  |     .. _LEGACY_TRANSACTION_CONTROL: | ||||||
|  |         https://docs.python.org/3/library/sqlite3.html#sqlite3.LEGACY_TRANSACTION_CONTROL | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def __init__(self, db_url: str): |     def __init__(self, db_url: str): | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user