我正在阅读 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(使用前将#替换为@)