我应该在一次选择后提交

Pad*_*lin 13 mysql mysql-python

我正在使用MySQLdb模块从python使用MySQL 5.0.

考虑一个简单的函数来加载和返回整个数据库表的内容:

def load_items(connection):
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM MyTable")
    return cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

此查询旨在成为一个简单的数据加载,并且除了该单个SELECT语句之外没有任何事务行为.

在运行此查询之后,可能需要一段时间再次使用相同的连接来执行其他任务,尽管其他连接仍然可以同时在数据库上运行.

我应该在通话connection.commit()后尽快cursor.execute(...)打电话,以确保操作未在连接上留下未完成的交易吗?

a_h*_*ame 13

您需要考虑以下两件事:

  1. 隔离级别有效
  2. 您希望在交易中"看到"什么样的州

MySQL中的默认隔离级别REPEATABLE READ意味着如果SELECT在事务内部运行两次,即使其他事务已提交更改,您也会看到完全相同的数据.

大多数时候,人们希望在运行第二个select语句时看到提交的更改 - 这是READ COMMITTED隔离级别的行为.

如果您没有更改MySQL中的默认级别,并且如果您在同一事务中运行SELECT两次,您确实希望看到数据库中的更改 - 那么您不能在"相同"事务中执行此操作并且您需要提交第一个SELECT声明.

如果你真的看到您的交易数据的一致状态,那么你应该没有明显犯.

几分钟后,第一个进程执行一个事务性操作并尝试提交.这个提交会失败吗?

这完全取决于你对" 交易 "的定义.你在关系数据库中所做的任何事情都是"事务性的"(实际上对于MySQL来说并不完全正确,但是为了论证,如果你只使用InnoDB作为你的存储引擎,你可以假设这一点).

如果"第一个进程"仅选择数据(即"只读事务"),那么当然提交将起作用.如果它试图修改另一个事务已经提交的数据并且您正在运行,则REPEATABLE READ可能会收到错误(在等待任何锁定释放之后).在这种情况下,我不是100%关于MySQL的行为.

您应该使用您喜欢的SQL客户端手动尝试使用两个不同的会话来了解行为.也要改变你的隔离级别,以便看到不同级别的效果.