mysql 中 SET autocommit=1 和 START TRANSACTION 之间的区别(我错过了什么吗?)

2023-11-30

我正在阅读 MySQL 中的事务,不确定我是否正确理解了某些特定内容,并且我想确保我理解正确,所以就开始吧。我知道事务应该做什么,只是不确定我是否理解语句语义。

所以,我的问题是,以下内容有什么问题吗(如果是这样的话,有什么问题):

默认情况下,MySQL 中启用自动提交模式。

Now, SET autocommit=0;将开始交易,SET autocommit=1;将隐式提交。有可能COMMIT;ROLLBACK;,在这两种情况下,自动提交之后仍设置为 0(并且隐式启动新事务)。

START TRANSACTION;基本上会SET autocommit=0;直到一个COMMIT; or ROLLBACK;发生。

换句话说,START TRANSACTION; and SET autocommit=0;是等价的,除了以下事实:START TRANSACTION;相当于隐式添加一个SET autocommit=1; after COMMIT; or ROLLBACK;

如果是这样的话我就不明白了http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serialized- 认为具有隔离级别意味着存在事务,这意味着自动提交无论如何都应该关闭?

如果开始事务和设置自动提交之间还有另一个区别(除了上述区别),它是什么?


了解数据库的事务(自动提交、显式和隐式)处理可以使您不必从备份恢复数据。

事务控制数据操作语句以确保它们是原子的。 “原子”意味着事务要么发生,要么不发生。向数据库发出事务完成信号的唯一方法是使用COMMIT or ROLLBACK语句(根据 ANSI-92,遗憾的是它不包含创建/开始事务的语法,因此它是特定于供应商的)。COMMIT应用事务中所做的更改(如果有)。ROLLBACK忽略事务中发生的任何操作 - 当 UPDATE/DELETE 语句执行意外操作时非常理想.

通常,各个 DML(插入、更新、删除)语句在自动提交事务中执行 - 一旦语句成功完成,它们就会被提交。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的恢复选项是从备份重建数据(前提是存在备份)。在MySQL中,自动提交是on默认为 InnoDB- MyISAM 不支持事务。可以使用以下方法禁用它:

SET autocommit = 0

显式事务是指语句被包装在显式定义的事务代码块中 -对于 MySQL 来说,就是START TRANSACTION。它还需要明确制定COMMIT or ROLLBACK交易结束时的声明。嵌套事务超出了本主题的范围。

隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。然而,就像显式交易一样,它们需要COMMIT or ROLLBACK须提供的声明。

结论

显式事务是最理想的解决方案——它们需要一个声明,COMMIT or ROLLBACK,完成交易,并且清楚地说明正在发生的事情,以便其他人在需要时阅读。如果以交互方式使用数据库,隐式事务是可以的,但是COMMIT只有在结果经过测试并彻底确定有效后才应指定声明。

这意味着您应该使用:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...并且仅使用COMMIT;当结果正确时。

也就是说,UPDATE 和 DELETE 语句通常只返回受影响的行数,而不返回具体的详细信息。将此类语句转换为 SELECT 语句并检查结果以确保正确性prior尝试 UPDATE/DELETE 语句。

Addendum

DDL(数据定义语言)语句会自动提交 - 它们不需要 COMMIT 语句。 IE:表、索引、存储过程、数据库和视图创建或更改语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 中 SET autocommit=1 和 START TRANSACTION 之间的区别(我错过了什么吗?) 的相关文章

  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 我是否需要在外键上指定 ON DELETE NO ACTION?

    我有以下与 SQL Server 2012 一起使用的 DDL CREATE TABLE Subject SubjectId INT IDENTITY 1 1 NOT NULL Name NVARCHAR 50 Not NULL CONST

随机推荐