如何在Python中使用MySQLdb更改SQL隔离级别?

11 投票
2 回答
9983 浏览
提问于 2025-04-16 15:48

我在查资料的时候发现,其他数据库的做法是可以在查询中使用多个语句,像这样:

>>> cursor = connection.cursor()
>>> cursor.execute("set session transaction isolation level read uncommitted; 
                    select stuff from table; 
                    set session transaction isolation level repeatable read;")

不过,遗憾的是,这样做并没有得到任何结果,因为看起来Python的数据库API(或者说是这个特定的实现?)不支持在一个查询中返回多个记录集。

有没有人以前成功过这种做法呢?

2 个回答

0
cur.executemany("SELECT * FROM bar WHERE thing = 'bar'; SELECT * FROM bar")
print cur.fetchall()

使用 cur.executemany 可以一次性执行多个用分号(;)分开的 SQL 语句。

17

我觉得这个方法在MySQLdb驱动下不太好用;你需要分别执行查询:

cur = conn.cursor()
cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
cur.execute("SELECT @@session.tx_isolation")
print cur.fetchall()[0]
cur.execute("SELECT * FROM bar")
print cur.fetchall()
cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ")
cur.execute("SELECT @@session.tx_isolation")
print cur.fetchall()[0]

# output
('READ-UNCOMMITTED',)
(('foo',), ('bar',))
('REPEATABLE-READ',)

MySQLdb的游标(cursor)执行方法(execute())只会处理到第一个查询,也就是在分号(;)之前的部分:

cur.execute("SELECT * FROM bar WHERE thing = 'bar'; SELECT * FROM bar")
print cur.fetchall()

# output
(('bar',),)

撰写回答