我读了docs:
...因为事务在游标执行查询时开始,但在执行COMMIT或ROLLBACK时结束 连接对象。
import MySQLdb
db = MySQLdb.connect(user="root", db="test")
c = db.cursor()
c.execute("SELECT * FROM books")
print c.fetchall()
我怀疑MySQLdb甚至在不修改数据的查询(如SELECT)上启动事务,因为很难知道查询是否只读取数据而不写入数据。
cursor.commit()
,以确保没有表被锁定?谢谢
答案 0 :(得分:3)
是的,SELECT
语句与其他语句类似,因此事务开始。
如果你想避免这种情况,你可以这样做:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM books ;
COMMIT ;
详细说明:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
表示以下指令可以读取已修改但尚未收到COMMIT
的行。
这种交易不会得到排他性锁。
第二部分SELECT * FROM books ;
显然是SQL statement
,第三部分COMMIT ;
结束交易并使其成为“永久”。
在这种情况下,没有写入,因此COMMIT
仅用于结束事务和
答案 1 :(得分:2)
确实是,但它也会在每次查询后自动提交,因为mysql客户端默认以 autocommit=1
开头
你不应该,因为SELECT
在执行语句后没有持有任何锁。在实践中,显式提交甚至可能导致显着减速。
可能有用:Why connection in Python's DB-API does not have "begin" operation?