【问题标题】:How to lock a sqlite3 database in Python?如何在 Python 中锁定 sqlite3 数据库?
【发布时间】:2012-01-12 00:03:55
【问题描述】:

有没有办法在 Python 中显式获取 sqlite3 数据库的锁?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    显式锁定数据库的方法是启动事务,如documentation 中所述:

    当一个数据库被多个连接访问,并且其中一个进程修改了数据库时,SQLite 数据库将被锁定,直到该事务被提交。

    发起交易的一种方法是使用connection as a context manager

    import sqlite3
    con = sqlite3.connect(...)
    ...
    with con:
        # Database is locked here
    

    另请注意,某些事务默认发生在implictly

    默认情况下,sqlite3 模块在数据修改语言 (DML) 语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即任何其他语句)之前隐式提交事务比 SELECT 或上述)。

    【讨论】:

    • 要明确一点:如果我使用“with con”技巧,我是否可以保证该块内数据库的所有读写操作一起发生? (也就是说,另一个线程无法更改我正在阅读的内容)。
    • 我在stackoverflow.com/questions/9070369/…发布了一个后续问题
    • 看起来......即使没有withpython 也会锁定 sqlite db(文件)以防止未来的连接,直到 con.close()。我建议time.sleep(10)con.close()SELECT 之前两次。
    【解决方案2】:

    来自 sqlite 常见问题解答,"Can multiple applications or multiple instances of the same application access a single database file at the same time?"

    多个进程可以同时打开同一个数据库。 多个进程可以同时执行 SELECT。但只有 一个进程可以随时更改数据库 然而,时间。

    无论您是否使用with connection 构造,许多进程都可以读取,在任何给定时间只有一个可以写入数据库。

    【讨论】:

      【解决方案3】:

      我们可以使用多处理命令来锁定数据库的读写进程。我正在使用以下命令,它工作正常:

      from multiprocessing import Lock 
      l.Lock()
      l.acquire()
      # Read/Write DB 
      l.release()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 2018-10-07
        相关资源
        最近更新 更多