mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-03 11:54:52 -04:00
Db txn set isolation level (#11799)
Co-authored-by: Brendan Abolivier <babolivier@matrix.org>
This commit is contained in:
parent
fc8598bc87
commit
b59d285f7c
5 changed files with 61 additions and 5 deletions
|
@ -13,8 +13,13 @@
|
|||
# limitations under the License.
|
||||
|
||||
import logging
|
||||
from typing import Mapping, Optional
|
||||
|
||||
from synapse.storage.engines._base import BaseDatabaseEngine, IncorrectDatabaseSetup
|
||||
from synapse.storage.engines._base import (
|
||||
BaseDatabaseEngine,
|
||||
IncorrectDatabaseSetup,
|
||||
IsolationLevel,
|
||||
)
|
||||
from synapse.storage.types import Connection
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -34,6 +39,15 @@ class PostgresEngine(BaseDatabaseEngine):
|
|||
self.synchronous_commit = database_config.get("synchronous_commit", True)
|
||||
self._version = None # unknown as yet
|
||||
|
||||
self.isolation_level_map: Mapping[int, int] = {
|
||||
IsolationLevel.READ_COMMITTED: self.module.extensions.ISOLATION_LEVEL_READ_COMMITTED,
|
||||
IsolationLevel.REPEATABLE_READ: self.module.extensions.ISOLATION_LEVEL_REPEATABLE_READ,
|
||||
IsolationLevel.SERIALIZABLE: self.module.extensions.ISOLATION_LEVEL_SERIALIZABLE,
|
||||
}
|
||||
self.default_isolation_level = (
|
||||
self.module.extensions.ISOLATION_LEVEL_REPEATABLE_READ
|
||||
)
|
||||
|
||||
@property
|
||||
def single_threaded(self) -> bool:
|
||||
return False
|
||||
|
@ -104,9 +118,7 @@ class PostgresEngine(BaseDatabaseEngine):
|
|||
return sql.replace("?", "%s")
|
||||
|
||||
def on_new_connection(self, db_conn):
|
||||
db_conn.set_isolation_level(
|
||||
self.module.extensions.ISOLATION_LEVEL_REPEATABLE_READ
|
||||
)
|
||||
db_conn.set_isolation_level(self.default_isolation_level)
|
||||
|
||||
# Set the bytea output to escape, vs the default of hex
|
||||
cursor = db_conn.cursor()
|
||||
|
@ -175,3 +187,12 @@ class PostgresEngine(BaseDatabaseEngine):
|
|||
|
||||
def attempt_to_set_autocommit(self, conn: Connection, autocommit: bool):
|
||||
return conn.set_session(autocommit=autocommit) # type: ignore
|
||||
|
||||
def attempt_to_set_isolation_level(
|
||||
self, conn: Connection, isolation_level: Optional[int]
|
||||
):
|
||||
if isolation_level is None:
|
||||
isolation_level = self.default_isolation_level
|
||||
else:
|
||||
isolation_level = self.isolation_level_map[isolation_level]
|
||||
return conn.set_isolation_level(isolation_level) # type: ignore
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue