当前位置: 首页 > 面试题库 >

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

胥承
2023-03-14
问题内容

我正在阅读MySQL中的事务,并且不确定我是否正确地掌握了某些特定的知识,并且我想确保我正确理解了这一点,因此请继续。我知道事务应该做什么,只是不确定我是否理解语句的语义。

因此,我的问题是,以下内容是否有错(并且,如果是这种情况,那是什么问题):

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

现在,SET autocommit=0;将开始事务,SET autocommit=1;将隐式提交。这是可能的COMMIT;,以及ROLLBACK;,在两个自动提交仍设置为0之后(和一个新的隐式启动事务)的情况下。

START TRANSACTION;基本上将SET autocommit=0;一直持续到COMMIT;ROLLBACK;发生。

换句话说,START TRANSACTION;SET autocommit=0;是等效的,除了以下事实:START TRANSACTION;等效地隐式添加了SET autocommit=0;after COMMIT;ROLLBACK;

如果是这种情况,我不理解http://dev.mysql.com/doc/refman/5.5/en/set-
transaction.html#isolevel_serializable-
认为具有隔离级别意味着存在事务,意味着应始终关闭自动提交功能?

并且,如果在开始事务和设置自动提交之间存在另一种差异(除了上述差异),那是什么?


问题答案:

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

事务控制数据操作语句以确保它们是原子的。“原子性”表示交易已发生或未发生。向数据库发出事务完成信号的唯一方法是使用COMMITor
ROLLBACK语句(根据ANSI-92,遗憾的是它不包含用于创建/开始事务的语法,因此它是特定于供应商的)。
COMMIT应用在交易中进行的更改(如果有)。 ROLLBACK 忽略事务中发生的任何动作-当UPDATE /
DELETE语句做意外的事情时,这是非常理想的


通常,单个DML(插入,更新,删除)语句在自动提交事务中执行-
语句成功完成后便会提交它们。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的还原选项是从备份中重建数据(假设存在备份)。在MySQL中,默认情况下,InnoDB的自动提交功能
处于启用状态
-MyISAM不支持事务。可以使用以下命令禁用它:

SET autocommit = 0

显式事务是指将语句包装在显式定义的事务代码块中- 对于MySQL,即START TRANSACTION。它还需要在交易结束时明确做出COMMITROLLBACK声明。嵌套事务不在本主题的范围之内。

隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。但是,像显式事务一样,它们需要提供COMMITor ROLLBACK语句。

结论

显式事务是最理想的解决方案-
它们要求使用语句COMMITROLLBACK来完成事务,并且明确说明正在发生的事情,以便其他人在需要时阅读。如果以交互方式使用数据库,则隐式事务是可以的,但是COMMIT只有在对结果进行了测试并确定其有效之后,才应指定语句。

这意味着您应该使用:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

…并且仅COMMIT;在结果正确时使用。

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

附录

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



 类似资料:
  • 问题内容: 之间有什么区别 和 问题答案: 可以执行通配符匹配: 如果不需要模式匹配,请使用=代替LIKE。它更快,更安全。(您正在使用参数化查询,对吗?)

  • 本文向大家介绍MySQL和MongoDB之间的区别,包括了MySQL和MongoDB之间的区别的使用技巧和注意事项,需要的朋友参考一下 MySQL是一个关系数据库。MongoDB是NoSQL数据库。 以下是MySQL和MongoDB之间的重要区别。 序号 键 的MySQL MongoDB 1 拥有/开发 MySQL由Oracle拥有。 MongoDB由MongoDB Inc.开发。 2 数据存储

  • 问题内容: 我的问题是:使用有意义吗?在两个线程(main + oneAnotherThread)中,使用执行程序服务效率高吗?是否通过调用比使用ExecutorService更好地直接创建新线程?在这种情况下使用ExecutorService有什么好处和坏处? PS:主线程和oneAnotherThread不访问任何公共资源。 我经历了:使用ExecutorService有什么优势?。一次只能有

  • 我想知道Executors类的这两种方法有什么区别?我有一个web应用程序,我每100毫秒检查一些数据,所以这就是为什么我使用这个带有scheduleWithFixedDelay方法的调度器。我想知道在这种情况下应该使用哪种方法(newScheduledThreadPool还是newSingleThreadScheduledExecutor)?我还有一个问题--在监视Glassfish服务器的Vi

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型