如何立即进行交易?

问题描述 投票:0回答:1

SQLite 事务 可以是

DEFERRED
IMMEDIATE
EXCLUSIVE
。默认值为
DEFERRED
,这意味着只有必要时才启动。如果并发事务从读取开始但继续写入,这可能会导致事务中止。可以通过使用
IMMEDIATE
来避免此类中止(以性能为代价)。

SQLAlchemy 抽象了 SQL 方言,包括 SQLite。它还有一个编写交易的模型:

with engine.begin() as connection:
    do_something_with_connection

我如何告诉 SQLAlchemy 事务应该是

IMMEDIATE
?我如何告诉 SQLAlchemy 所有 SQLite 事务应该是
IMMEDIATE

python sqlite sqlalchemy
1个回答
6
投票

核心事件https://docs.sqlalchemy.org/en/latest/core/events.html可用于拦截连接事件并重写事务开始时发出的BEGIN语句以达到你想要的目的。

有关更多详细信息,请参阅 sqlalchemy 文档中有关 sqlite 方言的部分 https://docs.sqlalchemy.org/en/latest/dialects/sqlite.html.

下面的示例代码是直接从文档中复制的,除了将 BEGIN 更改为 BEGIN IMMEDIATE 之外。

from sqlalchemy import create_engine, event

engine = create_engine("sqlite:///myfile.db")

@event.listens_for(engine, "connect")
def do_connect(dbapi_connection, connection_record):
    # disable pysqlite's emitting of the BEGIN statement entirely.
    # also stops it from emitting COMMIT before any DDL.
    dbapi_connection.isolation_level = None

@event.listens_for(engine, "begin")
def do_begin(conn):
    # emit our own BEGIN
    conn.execute("BEGIN IMMEDIATE")
© www.soinside.com 2019 - 2024. All rights reserved.