python sqlite“开始事务”和“提交”命令
如果我想通过python在数据库中启动事务,我是否必须显式执行sql命令“BEGIN transaction”,如下所示:python sqlite“开始事务”和“提交”命令,python,sqlite,transactions,Python,Sqlite,Transactions,如果我想通过python在数据库中启动事务,我是否必须显式执行sql命令“BEGIN transaction”,如下所示: import sqlite3 conn = sqlite3.connect(db) c = conn.cursor() c.execute('BEGIN TRANSACTION;') ##... some updates on the database ... conn.commit() ## or c.execute('COMMIT'). Are these two
import sqlite3
conn = sqlite3.connect(db)
c = conn.cursor()
c.execute('BEGIN TRANSACTION;')
##... some updates on the database ...
conn.commit() ## or c.execute('COMMIT'). Are these two expressions the same?
当我建立连接或开始事务时,是否锁定了数据库,以便从其他客户端进行更改?来自:
当一个数据库被多个连接访问,并且其中一个进程修改该数据库时,SQLite数据库将被锁定,直到提交该事务为止。timeout参数指定在引发异常之前,连接应等待锁消失的时间。超时参数的默认值为5.0 5秒
只有事务锁定数据库 然而,Python试图变得聪明,并且: 默认情况下,sqlite3模块在数据修改语言DML语句(即INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非DML、非查询语句i之前隐式提交事务。E除SELECT或上述内容之外的任何内容
因此,如果您在一个事务中,并发出诸如createtable…、VACUUM、PRAGMA之类的命令,sqlite3模块将在执行该命令之前隐式提交。这样做有两个原因。首先,这些命令中的一些在事务中不起作用。另一个原因是,如果事务处于活动状态或未处于活动状态,sqlite3需要跟踪事务状态 您可以通过connect调用的隔离级别参数或连接的隔离级别属性来控制sqlite3隐式执行或根本不执行哪种BEGIN语句 如果需要自动提交模式,则将隔离级别设置为“无” 否则,将其保留为默认值,这将导致一个简单的“BEGIN”语句,或者将其设置为SQLite支持的隔离级别之一:“DEFERRED”、“IMMEDIATE”或“EXCLUSIVE” 如果我想通过python在数据库中启动事务,我是否必须显式执行sql命令“BEGIN transaction”,如下所示:
import sqlite3
conn = sqlite3.connect(db)
c = conn.cursor()
c.execute('BEGIN TRANSACTION;')
##... some updates on the database ...
conn.commit() ## or c.execute('COMMIT'). Are these two expressions the same?
这取决于DML语句之前是在自动提交模式下,还是在手动提交模式下是在手动提交模式下否,但不幸的是在DDL或DQL语句之前是,因为手动提交模式在当前版本的SQLite3数据库驱动程序中未正确实现,请参见下文
conn.commit或c.execute'commit'。这两个表达相同吗
对
当我建立连接或开始事务时,是否锁定了数据库,以便从其他客户端进行更改,或者两者都不锁定
当您开始交易cf
要更好地了解自动提交和手动提交模式,请阅读。和否您不需要执行开始事务打开连接就意味着开始事务?据我所知,是的。我鼓励您在sqlite3 shell上运行一些代码,以便快速测试它。从另一个角度看,如果您进入python标准库源代码并查看/sqlite3/dump.py(我认为上面的代码正在使用),您会看到BEGIN TRANSACTION语句是自动为您完成的。因此,如果您在事务中并发出CREATE TABLE…、真空、PRAGMA等命令,sqlite3模块将在执行该命令之前隐式提交。From:在版本3.6中更改:sqlite3用于在DDL语句之前隐式提交打开的事务。情况不再如此。@DaleZ它仍然会自动打开它们,现在您不知道事务是否隐式提交…