事务是否在SELECT上启动?

war*_*iuc 5 python mysql mysql-python

我在文档中读到:

...因为事务在游标执行查询时开始,但在Connection对象执行COMMIT或ROLLBACK时结束.

import MySQLdb

db = MySQLdb.connect(user="root", db="test")
c = db.cursor()
c.execute("SELECT * FROM books")
print c.fetchall()
Run Code Online (Sandbox Code Playgroud)

我怀疑MySQLdb甚至在不修改数据的查询(如SELECT)上启动事务,因为很难知道查询是否只读取数据而不写入数据.

  1. 这是真的吗?
  2. 如果是这样,这意味着我应该cursor.commit()在每次查询后执行,以确保没有表被锁定?
  3. 我不知道的其他问题?

谢谢

Don*_*sto 3

是的,SELECT声明与其他声明一样,因此事务开始。

如果你想避免这种情况,你可以这样做:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM books ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)

详细地:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
Run Code Online (Sandbox Code Playgroud)

表示以下指令可以读取已修改但尚未收到的行COMMIT。这种事务不会获得独占锁。

第二部分SELECT * FROM books ;显然是a SQL statement,第三部分COMMIT ;结束交易并使其“永久”。在这种情况下,不会执行任何写入操作,因此COMMIT仅用于结束事务并且