欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 【python下用sqlite3, 多线程下报错,原因和解决 】

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

2024/10/24 22:18:26 来源:https://blog.csdn.net/qq_38428433/article/details/141039178  浏览:    关键词:【python下用sqlite3, 多线程下报错,原因和解决 】

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

sqlite3.OperationalError: cannot commit - no transaction is active

1. 原因

多线程写冲突

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

2. 解决方案

使用锁

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

import sqlite3
import threadinglock = 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()

使用事务

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

import sqlite3
import threadingdef 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()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com