提交在python sqlite3的模块行为和原子(Commit behavior and atom

2019-07-04 06:56发布

如果我想创建一个表,然后插入另一个表中的新条目,可以在此sqlite的模块中进行原子?

指的在文档http://docs.python.org/2/library/sqlite3.html :

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

所以,如果你是一个事务中,并发出像CREATE TABLE ...,VACUUM命令,PRAGMA的sqlite3的模块将隐式执行该命令之前提交。 有两个理由这样做。 首先是某些命令不交易内工作。 另一个原因是,sqlite3的需要跟踪交易状态(如果交易活跃与否)。

我不知道这第二段是为了适用于自动启动交易或手动和自动的。

SQLite的文档http://www.sqlite.org/lang_transaction.html告诉我们,手动的交易不会承诺,直到显式COMMIT:

事务可以手动使用BEGIN命令启动。 此类交易通常持续到下一个COMMIT或ROLLBACK命令。

因此,假设我们有这样的事情:

con = sqlite3.connect(fdb) 
cur = con.cursor()

sql = 'begin transaciton'
cur.execute(sql)    

sql = 'CREATE TABLE some-table ...
cur.execute(sql)

# *** is there an implicit commit at this point ?! ***

sql = 'INSERT INTO  another-table ...
cur.execute(sql)

con.commit()

请问这是原子,或将蟒蛇的SQLite使后提交create table的语句? 有没有办法让它原子?

Answer 1:

Python的sqlite3的libary插入自动在需要甚至没有提交。

为了使您的整个事务的原子,使用任何其他Python SQLite的包装,比如,例如, APSW 。



Answer 2:

你不能做到这一点原子。 Python的SQLite库隐式地发出一个COMMIT当你执行一个CREATE TABLE ..语句,因为SQLite不支持执行CREATE TABLE ..语句,而在事务活动。

您可以通过在两个Python解释器和打开数据库测试此sqlite3命令行工具。 只要你发出不久CREATE TABLE ..语句,你可以运行.schema在命令sqlite3命令行工具,并看到语句的结果。

请注意,这意味着,任何你在交易之前没有CREATE TABLE ..语句也一直致力于。 为了寻找另一种说法,在CREATE TABLE ..语句首先提交,然后开始一个全新的事务。



文章来源: Commit behavior and atomicity in python sqlite3 module