我正在阅读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;
之后隐式添加ROLLBACK;
的事实。
如果是这样,我不理解http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable-看到具有隔离级别意味着存在事务,这意味着自动提交无论如何都应该关闭?
并且,如果在开始事务和设置自动提交之间存在另一种差异(除了上述差异),那是什么?
最佳答案
了解数据库的事务(自动提交,显式和隐式)处理可以使您不必从备份还原数据。
事务控制数据操作语句以确保它们是原子的。 “原子性”表示交易已发生或未发生。向数据库发出事务完成信号的唯一方法是使用COMMIT
或ROLLBACK
语句(根据ANSI-92,遗憾的是,该语句不包括用于创建/开始事务的语法,因此它是特定于供应商的)。 COMMIT
应用事务中所做的更改(如果有)。 ROLLBACK
忽略事务中发生的任何操作-当UPDATE / DELETE语句执行意外的时,这是非常可取的。
通常,单个DML(插入,更新,删除)语句在自动提交事务中执行-语句成功完成后便会提交它们。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的还原选项是从备份中重建数据(假设存在备份)。在MySQL中,autocommit is on by default for InnoDB-MyISAM不支持事务。可以使用以下命令禁用它:
SET autocommit = 0
显式事务是指将语句包装在显式定义的事务代码块for MySQL, that's
START TRANSACTION
中。在事务结束时,还需要显式制作的COMMIT
或ROLLBACK
语句。嵌套事务不在本主题的范围之内。隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。但是,像显式事务一样,它们需要提供
COMMIT
或ROLLBACK
语句。结论
显式事务是最理想的解决方案-它们需要语句
COMMIT
或ROLLBACK
来完成事务,并且清楚地说明了发生的情况,以便其他人在需要时阅读。如果以交互方式使用数据库,则隐式事务是可以的,但是COMMIT
语句仅应在测试了结果并确定其有效之后才能指定。这意味着您应该使用:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...并且仅在结果正确时使用
COMMIT;
。也就是说,UPDATE和DELETE语句通常仅返回受影响的行数,而不返回特定的详细信息。将此类语句转换为SELECT语句并查看结果,以确保在尝试UPDATE / DELETE语句之前的正确性。
附录
DDL(数据定义语言)语句是自动提交的-它们不需要COMMIT语句。 IE:表,索引,存储过程,数据库以及 View 创建或更改语句。
关于mysql - SET autocommit = 1和mysql中的START TRANSACTION之间的区别(我错过了什么吗?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2950676/