MySQL 事务autocommit自动提交操作
MySQL默认操作模式就是automit自动提交模式。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。我们可以通过设置automit的值改变是否是自动提交automit模式。
通过以下命令可以查看当前automit模式
mysql> show variables like 'automit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | automit | ON | +---------------+-------+ 1 row in set (0.04 sec)
从查询结果中,我们发现Value的值是ON,表示automit开启。我们可以通过以下SQL语句改变这个模式
mysql> set automit = 0;
值0和OFF都是一样的,,1也就表示ON。通过以上设置automit=0,则用户将一直处于某个事务中,直到执行一条mit提交或rollback语句才会结束当前事务重新开始一个新的事务。
举个例子,张三给李四转账500元。那么在数据库中应该是以下操作
1,先查询张三的账户余额是否足够
2,张三的账户上减去500元
3,李四的账户上加上500元
以上三个步骤就可以放在一个事务中执行提交,要么全部执行要么全部不执行,如果一切都OK就mit提交永久性更改数据;如果出错则rollback回滚到更改前的状态。利用事务处理就不会出现张三的钱少了李四的账户却没有增加500元或者张三的钱没有减去李四的账户却加了500元。
MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变automit没有什么作用。但不会报错,所以要使用事务处理的童鞋一定要确定你所操作的表示支持事务处理的,如InnoDB。如果不知道表的存储引擎可以通过查看建表语句查看建表的时候有没有指定事务类型的存储引擎,如果没有指定存储引擎默认则是MyISAM不支持事务的存储引擎。
,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。
这些都是要消耗系统资源的,要谨慎选择。
补充MySQL的事务处理(Transation)和自动执行(AutoCommit)与提交类型(Completion)
1、事务(transaction)
事务在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务主要用于处理操作量大,复杂度高的数据。如果你要删除一条主表信息,而主表有多个从表的时候,你需要有步骤地删除明细后再删除主表信息,这个过程极其容易出错,那么这个时候就是用事务才处理是最合适的了。
2、事务(Transcation)的用法
事务开始(start transaction or begin)
提交(mit)
回滚(rollback)
3、MYSQL支持的引擎(InnoDB)
show engines;
4、自动执行(AutoCommit)与提交类型(Completion)
使用事务有两种方式,分别为隐式事务和显式事务。隐式事务实际上就是自动提交,Oracle 默认不自动提交,需要手写 COMMIT。在MySQL中,自动提交(automit)在支持事务(transaction)的引擎中,若automit=true,则不需要mit的情况下直接提交语句形成永久性修改,Mysql默认打开automit,也可以通过配置设置。
set automit=0;(AutoCommit Off) set automit=1;(AutoCommit On) set pletion_type=0;(No Chain) set pletion_type=1;(Chain) set pletion_type=2;(Release)
也可以通过语句查询当前配置
show variables like '%automit%'; show variables like '%pletion%';
5、验证例子
mysql> BEGIN; -> INSERT INTO test SELECT '关羽'; -> COMMIT; -> BEGIN; -> INSERT INTO test SELECT '张飞'; -> INSERT INTO test SELECT '张飞'; -> ROLLBACK; -> SELECT FROM test; -> // Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.03 sec) Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 ERROR 1062 (23000): Duplicate entry '张飞' for key 'PRIMARY' mysql> select from test;//
当前窗口结果
新建窗口结果
结论由于test表中name的唯一性约束,看代码的话,两个"张飞"执行后(无论有无触发主键约束),实际由于第二个"张飞"触发了唯一性约束异常,所以我认为事务会跳出,所以在当前连接中,test表中可以看到一个张飞,实际上第二个事务,并没有提交成功。
接下来,我们试试正常提交的数据。
mysql> BEGIN; -> INSERT INTO test SELECT '关羽'; -> COMMIT; -> BEGIN; -> INSERT INTO test SELECT '张飞'; -> INSERT INTO test SELECT '刘备'; -> ROLLBACK; -> // Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.02 sec) Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.04 sec) mysql> select from test;//
当前窗口结果
新建窗口结果
结论对比这次的测试结果,所以我认为第一个测试,并没有执行rollback,而是跳出事务处理异常机制了。
因为mysql默认打开了automit,那么我想验证下在无显示事务的情况下(即无begin开头),两个"张飞"是如何自处的?
mysql> BEGIN; -> INSERT INTO test SELECT '关羽'; -> COMMIT; -> INSERT INTO test SELECT '张飞'; -> INSERT INTO test SELECT '张飞'; -> ROLLBACK; -> // Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 1 row affected (0.05 sec) Records: 1 Duplicates: 0 Warnings: 0 ERROR 1062 (23000): Duplicate entry '张飞' for key 'PRIMARY' mysql> select from test;//
当前窗口结果
新建窗口结果
结论其实看执行结果就知道了,第1个"张飞"作为单独的事务已经执行成功了,第二个"张飞"由于触发了主键约束所以执行失败了。除了显示事务外,有没有办法在没结束事务前(无Commit)前,可以让两个"张飞"合并成一个事务呢?
可以设置set pletion_type=1;(chain),也就是说无论几个"张飞"在还没提交之前,都是一个事务。
代码与上面的一样。
mysql> SET @@pletion_type = 1; -> BEGIN; -> INSERT INTO test SELECT '关羽'; -> COMMIT; -> INSERT INTO test SELECT '张飞'; -> INSERT INTO test SELECT '张飞'; -> ROLLBACK; -> // Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 Query OK, 0 rows affected (0.02 sec) Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 ERROR 1062 (23000): Duplicate entry '张飞' for key 'PRIMARY'
当前窗口结果
新建窗口结果
结论因为我设置了set pletion_type=1(chain),相当与在第一个"张飞"前加了begin,所以第二个"张飞"由于触发了主键约束所以导致事务失败,插入数据失败。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持狼蚁SEO。如有错误或未考虑完全的地方,望不吝赐教。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南