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 之间的区别(我错过了什么吗?) 的相关文章

  • 处理大数据表时应该如何使用Hibernate Mapping

    问题定义 我有一个包含大量数据 超过 100 000 行 的数据库表 表结构如下 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个 applicationID 可能有数千个文档
  • 如何在php/mysql中使用事务

    我正在使用 php mysql 我知道 mysql 中的事务 但不能在我的脚本中使用 下面是我的脚本 如何在我的代码中使用 php 事务 即 BEGIN ROLLBACK COMMIT foreach json a shop as json
  • PostgreSQL 窗口函数:row_number() over(按 col2 分区 col 顺序)

    以下结果集源自具有一些连接和联合的 SQL 查询 SQL 查询已经对 Date 和 game 上的行进行了分组 我需要一列来描述按日期列分区的游戏的尝试次数 Username Game ID Date johndoe1 Game 1 100
  • 在 Python 中,如果我有 unix 时间戳,如何将其插入 MySQL 日期时间字段?

    我正在使用 Python MySQLDB 我想将其插入 Mysql 中的 DATETIME 字段 我该如何使用cursor execute 来做到这一点 要将 UNIX 时间戳转换为 Python 日期时间对象 请使用datetime fr
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH
  • 获取从开始日期到结束日期的活跃周数

    我的订阅数据如下所示 数据显示用户何时购买订阅 它有user id subscription id start date and end date 我已经得出wk start and wk end从中 user subscription i
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • IN 运算符对 SQL 查询性能的影响有多大?

    我的 SQL 查询需要 9 个小时才能执行 见下文 Select Field1 Field2 From A Where Field3 IN 45 unique values here 当我将此查询拆分为 3 个完全相同的查询 仅每个 IN
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • java.lang.NoSuchMethodError:没有虚拟方法 setTag(Ljava/lang/Object;)

    我刚刚完成使用登录和注册屏幕与齐射的代码 但在模拟器中运行时我收到此错误 java lang NoSuchMethodError No virtual method setTag Ljava lang Object Lcom android
  • 如何在“order by”中添加条件?

    我有一个带有输入参数的存储过程 现在根据这个参数 我的 order by 语句将发生变化 如果输入参数是 ID int类型列 则按ID排序 如果是 ProductType 则按产品类型排序 如果是 IssueDate 则应按问题日期排序 现
  • SQL Server - SQL 替换整个数据库中所有表中的所有列

    这是一个很遥远的事情 我猜这个问题没有简单的答案 但是 我继承了一个数据库 其中填充了一些可怕的数据 许多包含描述的行都有回车符 这意味着当我们 BCP 输出数据时 它会带有回车符 我的问题 有没有办法在 MS SQL Server 中对整
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • 什么是更好的?子查询或内连接十个表?

    一个旧系统已抵达我们的办公室进行一些更改和修复 但它也存在性能问题 我们并不确切知道这种缓慢的根源是什么 当我们重构旧代码时 我们发现了几个具有以下模式的 sql 查询 出于示例目的 简化了查询 SELECT SELECT X FROM A
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • Postgres 按查询分组

    我正在尝试在 postgres 的查询中使用 group by 我无法让它按照我想要的方式工作 以便根据需要对结果进行分组 这是另一个堆栈问题的扩展我刚刚回答过的递归查询 https stackoverflow com questions
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 如何关闭整个数据库的区分大小写

    我创建了一个包含许多脚本和许多存储过程的数据库 在这个数据库中 我们没有注意担心区分大小写 因为它对于我的本地开发计算机来说是关闭的 综上所述 我试图弄清楚如何使以下两条语句返回相同的结果 SELECT FROM companies SEL

随机推荐