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

我正在阅读关于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;COMMIT;之后COMMIT;ROLLBACK;

如果是这样的话,我不明白http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable – 看作隔离级别意味着有一个事务,这意味着autocommit应该closures吗?

如果在开始交易和设置自动提交之间还有其他的区别(除了上面描述的那个),它是什么?

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

事务控制数据操作语句以确保它们是primefaces的。 “primefaces”是指交易要么发生,要么不发生。 将事务完成信号告知数据库的唯一方法是使用COMMITROLLBACK语句(根据ANSI-92,可悲的是没有包括用于创build/开始事务的语法,因此它是供应商特定的)。 COMMIT应用在交易中所做的更改(如果有的话)。 ROLLBACK忽略了在事务中发生的任何操作 – 当UPDATE / DELETE语句做一些意外事情时非常可取

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

 SET autocommit = 0 

显式事务是当语句被包装在明确定义的事务代码块中时 – 对于MySQL,这是START TRANSACTION 。 它还需要在事务结束时显式创buildCOMMITROLLBACK语句。 嵌套事务超出了本主题的范围。

隐式事务与显式事务略有不同。 隐式事务不需要明确定义事务。 但是,像显式事务一样,它们需要提供COMMITROLLBACK语句。

结论

显式事务是最理想的解决scheme – 它们需要一个语句COMMITROLLBACK来完成事务处理,如果有需要,清楚地说明了正在发生的事情。 如果以交互方式使用数据库,隐式事务是可以的,但只有在结果经过testing并彻底确定为有效后才能指定COMMIT语句。

这意味着你应该使用:

 SET autocommit = 0; START TRANSACTION; UPDATE ...; 

…只使用COMMIT; 当结果是正确的。

也就是说,UPDATE和DELETE语句通常只返回受影响的行数,而不是具体的细节。 将这些语句转换为SELECT语句并尝试UPDATE / DELETE语句之前查看结果以确保正确性。

附录

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

InnoDB中你有START TRANSACTION; ,在这个引擎中是官方推荐的方式来做交易,而不是SET AUTOCOMMIT = 0; (除非用于优化只读事务,否则不要使用SET AUTOCOMMIT = 0;对于InnoDB中的事务)。 用COMMIT;

你可能想要使用SET AUTOCOMMIT = 0;InnoDB中用于testing目的,而不是为了交易。

MyISAM中,您没有START TRANSACTION; 在这个引擎中,使用SET AUTOCOMMIT = 0; 交易。 用COMMIT;SET AUTOCOMMIT = 1; (在下面的MyISAM示例注释中有所不同)。 您也可以在InnoDB中以这种方式进行交易。

来源: http : //dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit

一般用途交易的例子:

 /* InnoDB */ START TRANSACTION; INSERT INTO table_name (table_field) VALUES ('foo'); INSERT INTO table_name (table_field) VALUES ('bar'); COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */ /* MyISAM */ SET AUTOCOMMIT = 0; INSERT INTO table_name (table_field) VALUES ('foo'); INSERT INTO table_name (table_field) VALUES ('bar'); SET AUTOCOMMIT = 1 /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */; 

如果你想使用回滚,那么使用启动事务 ,否则忘记所有这些事情,因为MySQL默认设置autocommit为1。