Python 为什么事务在创建游标后但在用完之前不处于活动状态?

Python 为什么事务在创建游标后但在用完之前不处于活动状态?,python,sqlite,Python,Sqlite,考虑以下代码: 导入sqlite3 conn=sqlite3.connect':内存:' conn.execute“创建表t1 col1、col2、col3;” 康涅狄格州 行=[k+1,k+2,k+3表示范围1000中的k] conn.executemany'插入t1值?,?,?;',排 康涅狄格州 curs=conn.execute'SELECT*fromt1;' nextcurs printconn.in_事务 对我来说,这打印为False,而我的期望是它将返回True,因为我没有遍历SE

考虑以下代码:

导入sqlite3 conn=sqlite3.connect':内存:' conn.execute“创建表t1 col1、col2、col3;” 康涅狄格州 行=[k+1,k+2,k+3表示范围1000中的k] conn.executemany'插入t1值?,?,?;',排 康涅狄格州 curs=conn.execute'SELECT*fromt1;' nextcurs printconn.in_事务 对我来说,这打印为False,而我的期望是它将返回True,因为我没有遍历SELECT中的所有行,这意味着语句没有完全执行。我没有发布明确的开始。我知道在这种情况下,行为取决于conn.isolation_级别,但据我所知,该属性仅在发出DML语句时才相关。这是否意味着对于所有其他语句,当您在没有显式开始的情况下执行它们时,会打开一个隐式事务?i、 e.对于非DML语句,我们总是处于自动提交模式,可能conn.in_事务仅在显式事务中返回True,而在隐式事务中返回False?如果我的SELECT启动了一个隐式事务,我知道它必须处于活动状态,因为只有在最后一个游标关闭时才会自动提交此类事务。请参见,但我仍然打开了一个游标

编辑:还有一个问题。如果在上面的代码之后运行下面的代码,它会打印-1、-2、-3,即使在更新之前执行了我的选择,我也可以在光标完成之前自由地对数据库进行更改和提交更改

conn.execute'updatet1 SET col1=-1,col2=-2,col3=-3其中col1=3' 康涅狄格州 nextcurs printnextcurs 我希望打印3、4、5,因为这是更新之前的关系。我的期望错了吗?

来自[强调添加]

内部交易

如果事务处于活动状态且存在未提交的更改,则为True,否则为False。只读属性


从字面上看,由于SELECT从未有未提交的更改,因此该属性永远不会为真。此外,事务中还有一个连接属性,而不是游标属性。

SELECT确实会在SQLite中开始读取事务。发布了新的和改进的答案。我知道in_事务是一个连接属性。但是从SQLite文档中我们可以看到,隐式事务是自动启动的事务,而不是由BEGIN启动的事务,在最后一个活动语句完成时自动提交。语句在其最后一个光标关闭时结束。。。我知道Python的游标和SQLite的内部游标不一样,但是它们之间一定有联系,我猜,对于一个用之不竭的Python游标,SQLite游标也不会关闭。从文档中我很清楚,in_事务在这个代码段中将返回False,因为没有未提交的更改。如果认为nextcurs是最后一条活动语句,那么它也与最后一条活动语句完成的时间一致。根据我的解释,结果是我所期望的,所以我坚持:是的,你是对的。但我很好奇:你认为这是一个命名不好的属性吗?因为该连接在执行SELECT后位于事务中。最后一条活动语句结束时的引号来自SQLite文档,而不是Python文档。语句是指SQL语句,而不是Python语句。