mysql - 我应该在单次选择后提交吗

标签 mysql mysql-python

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

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

def load_items(connection):
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM MyTable")
    return cursor.fetchall()

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

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

我是否应该在 cursor.execute(...) 调用之后立即调用 connection.commit() 以确保操作没有留下未完成的事务在连接上?

最佳答案

您需要考虑两件事:

  1. 生效的隔离级别
  2. 您想在交易中“看到”什么样的状态

MySQL 中的默认隔离级别是REPEATABLE READ,这意味着如果您在一个事务中运行两次SELECT,您将看到完全相同的数据,即使其他事务已经 promise 的变化。

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

如果您没有更改 MySQL 中的默认级别,并且您确实希望在同一个事务中运行 SELECT 两次时看到数据库中的更改 - 那么您不能在“相同”事务,您需要提交第一个 SELECT 语句。

如果您确实想要在您的事务中看到一致的数据状态,那么显然您应该提交。

then after several minutes, the first process carries out an operation which is transactional and attempts to commit. Would this commit fail?

这完全取决于您对“是事务性的”的定义。您在关系数据库中所做的任何事情都是“事务性的”(实际上对于 MySQL 而言并非完全如此,但为了论证,如果您仅使用 InnoDB 作为存储引擎,则可以假设这一点)。

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

您真的应该使用您最喜欢的 SQL 客户端在两个不同的 session 中手动尝试此操作,以了解行为。也请更改您的隔离级别以查看不同级别的效果。

关于mysql - 我应该在单次选择后提交吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287749/

相关文章:

mysql - 我需要一个简单的 sql 查询来查找具有特定字符的单词

php - 相关子查询在 phpMyAdmin 中有效,但在 PHP 脚本中超时

python - 如何使用 MySQLdb 将整数和字符串值插入 MySQL?

python - For 循环后清除 Python 中的元组

php - 如何从表单字段更新多个 mysql 行

mysql - 如何向现有 MySQL JSON 数组添加新的 JSON 数组字段

python - MySQL-python 未安装在 virtualenv 中(环境错误 : mysql_config not found)

python - 在 Windows 7 上安装 Python MySQLdb 时出错

python - 使用 Python 在 MySQL 中从 JSON 对象插入多行

mysql - 如何在 MySQL 中对以下日期进行分组