MySQL控制(关闭、打开)自动提交功能——commit和rollbacke的使用

      今天在操作mysql数据库时,犯了一个大错误,执行了一个更新语句,但时条件没写全,结果在执行了几秒之后才发现这个问题,将一些不该改变的记录值改变了。1天时间全部耗在数据恢复上了,于是恶补了mysql中关于自动提交功能及commit和rollback的内容,在此做一个标记,防止类似事情再次发生!

MySQL的自动提交功能

        在MySQL中执行命令时,通常都直接被确定提交了。也就是说用户不用意识此事,所有的命令都会被自动COMMIT。特别是当存储引擎为MyISAM的情况下,本身它是不支持事务处理的,只要执行了命令,所有的命令部会被提交。

        这样的默认自动提交的功能就被称为自动提交功能。自动提交功能默认被置为ON的状态。但是,如果存储引擎为InnoDB (Default)时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前可以执行ROLLBACK 命令回滚更新操作。

        所有的 DML 语句都是要显式提交的(autocommit=OFF情况下),也就是说要在执行完DML语句之后,执行 COMMIT 。而其他的诸如 DDL语句的,都是隐式提交的。也就是说,在运行那些非 DML 语句后,数据库已经进行了隐式提交,例如 CREATETABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。在提交事务(commit)之前可以用rollback回滚事务。

禁用自动提交

方式一、

1、在执行DML语句(inser / update / delete)之前,先执行一个begin;语句,进行了一段时间的数据库操作之后使用commit提交所有操作或者使用rollback回滚所有操作

p.s. 方式一要注意,一次commit或一次rollback表示最近一个begin到此次commit或rollback之间的操作都将提交或回滚,这之后的操作都必须重新设置begin,否则还会继续使用autocommit=ON的策略。

方式二、

1、登录mysql数据库

2、set autocommit='false';

3、查看是否禁用自动提交: show variables like "autocommit";                   (如果是OFF表示禁用成功)

4、执行一段insert / update / delete语句,检查数据无错误之后再执行commit;这样,这段时间内的所有操作都将提交到数据库中,如果发现执行了不正确的insert / update / delete语句,则使用rollback,此时将会回滚到上一个commit之后数据库的状态。

mysql中set autocommit=0与start transaction区别

set autocommit=0,
当前session禁用自动提交事物,自此句执行以后,每个DDL语句或者语句块所在的事务都需要显示"commit"才能提交事务。

start transaction

指的是启动一个新事务。

         在默认的情况下,MySQL从自动提交(autocommit)模式运行,这种模式会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化。事实上,这相当于把每一条语句都隐含地当做一个事务来执行。如果你想明确地执行事务,需要禁用自动提交模式并告诉MySQL你想让它在何时提交或回滚有关的修改。
         执行事务的常用办法是发出一条START TRANSACTION(或BEGIN)语句挂起自动提交模式,然后执行构成本次事务的各条语句,最后用一条 COMMIT语句结束事务并把它们作出的修改永久性地记入数据库。万一在事务过程中发生错误,用一条ROLLBACK语句撤销事务并把数据库恢复到事务开 始之前的状态。

       START TRANSACTION语句"挂起"自动提交模式的含义是:在事务被提交或回滚之后,该模式将恢复到开始本次事务的 START TRANSACTION语句被执行之前的状态。(如果自动提交模式原来是激活的,结束事务将让你回到自动提交模式;如果它原来是禁用的,结束 当前事务将开始下一个事务。)
        如果是autocommit模式  ,autocommit的值应该为 1 ,不autocommit 的值是 0 ;请在操作前确定autocommit 的模式是否开启 

猜你喜欢

转载自my.oschina.net/fairy1674/blog/1819482