Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python sqlite“开始事务”和“提交”命令_Python_Sqlite_Transactions - Fatal编程技术网

python sqlite“开始事务”和“提交”命令

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

如果我想通过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?
当我建立连接或开始事务时,是否锁定了数据库,以便从其他客户端进行更改?

来自:

当一个数据库被多个连接访问,并且其中一个进程修改该数据库时,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它仍然会自动打开它们,现在您不知道事务是否隐式提交…