事务是否在SELECT上启动?

时间:2012-01-12 08:22:54

标签: python mysql mysql-python

我读了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)上启动事务,因为很难知道查询是否只读取数据而不写入数据。

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

2 个答案:

答案 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)

  1. 确实是,但它也会在每次查询后自动提交,因为mysql客户端默认以autocommit=1开头

  2. 你不应该,因为SELECT在执行语句后没有持有任何锁。在实践中,显式提交甚至可能导致显着减速。

  3. 可能有用:Why connection in Python's DB-API does not have "begin" operation?