【python下用sqlite3, 多线程下报错,原因和解决 】

在python下用sqlite3, 多线程 在UPDATE 或者INSERT的时候, 会报错

sqlite3.OperationalError: cannot commit - no transaction is active

1. 原因

多线程写冲突

  • 非原子写操作:如果多个线程同时执行非原子写操作,可能会导致数据覆盖或不一致。

2. 解决方案

使用锁

使用锁来确保同一时间只有一个线程可以执行写操作。

go 复制代码
import sqlite3
import threading

lock = threading.Lock()

def worker(conn, thread_id):
    with lock:
        cursor = conn.cursor()
        cursor.execute("INSERT INTO test (id, value) VALUES (?, ?)", (thread_id, f"value_{thread_id}"))
        conn.commit()
        cursor.close()

def main():
    conn = sqlite3.connect('example.db', check_same_thread=False)
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)")
    conn.commit()
    cursor.close()

    threads = []
    for i in range(5):
        thread = threading.Thread(target=worker, args=(conn, i))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    conn.close()

if __name__ == "__main__":
    main()

使用事务

显式事务管理:在每个线程中显式地开始和提交事务,确保事务的原子性和一致性。

go 复制代码
import sqlite3
import threading

def worker(conn, thread_id):
    cursor = conn.cursor()
    cursor.execute("BEGIN")
    cursor.execute("INSERT INTO test (id, value) VALUES (?, ?)", (thread_id, f"value_{thread_id}"))
    conn.commit()
    cursor.close()

def main():
    conn = sqlite3.connect('example.db', check_same_thread=False)
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)")
    conn.commit()
    cursor.close()

    threads = []
    for i in range(5):
        thread = threading.Thread(target=worker, args=(conn, i))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    conn.close()

if __name__ == "__main__":
    main()
相关推荐
码路飞11 分钟前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
倔强的石头_39 分钟前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
曲幽3 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程7 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪7 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook7 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田20 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python