mysql开启事务没有提交(MySQL 事务autocommit自动提交操作)
mysql开启事务没有提交
MySQL 事务autocommit自动提交操作MySQL默认操作模式就是autocommit自动提交模式。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。我们可以通过设置autocommit的值改变是否是自动提交autocommit模式。
通过以下命令可以查看当前autocommit模式
|
mysql> show variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | ON | + ---------------+-------+ 1 row in set (0.04 sec) |
从查询结果中,我们发现Value的值是ON,表示autocommit开启。我们可以通过以下SQL语句改变这个模式
|
mysql> set autocommit = 0; |
值0和OFF都是一样的,当然,1也就表示ON。通过以上设置autocommit=0,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。
举个例子,张三给李四转账500元。那么在数据库中应该是以下操作:
1,先查询张三的账户余额是否足够
2,张三的账户上减去500元
3,李四的账户上加上500元
以上三个步骤就可以放在一个事务中执行提交,要么全部执行要么全部不执行,如果一切都OK就commit提交永久性更改数据;如果出错则rollback回滚到更改前的状态。利用事务处理就不会出现张三的钱少了李四的账户却没有增加500元或者张三的钱没有减去李四的账户却加了500元。
MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变autocommit没有什么作用。但不会报错,所以要使用事务处理的童鞋一定要确定你所操作的表示支持事务处理的,如InnoDB。如果不知道表的存储引擎可以通过查看建表语句查看建表的时候有没有指定事务类型的存储引擎,如果没有指定存储引擎默认则是MyISAM不支持事务的存储引擎。
当然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。
这些都是要消耗系统资源的,要谨慎选择。
补充:MySQL的事务处理(Transation)和自动执行(AutoCommit)与提交类型(Completion)
1、事务(transaction)
事务在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务主要用于处理操作量大,复杂度高的数据。如果你要删除一条主表信息,而主表有多个从表的时候,你需要有步骤地删除明细后再删除主表信息,这个过程极其容易出错,那么这个时候就是用事务才处理是最合适的了。
2、事务(Transcation)的用法
事务开始(start transaction or begin)
提交(commit)
回滚(rollback)
3、MYSQL支持的引擎(InnoDB)
|
show engines; |
4、自动执行(AutoCommit)与提交类型(Completion)
使用事务有两种方式,分别为隐式事务和显式事务。隐式事务实际上就是自动提交,Oracle 默认不自动提交,需要手写 COMMIT。在MySQL中,自动提交(autocommit)在支持事务(transaction)的引擎中,若autocommit=true,则不需要commit的情况下直接提交语句形成永久性修改,Mysql默认打开autocommit,也可以通过配置设置。
|
set autocommit=0;(AutoCommit Off ) set autocommit=1;(AutoCommit On ) set completion_type=0;( No Chain) set completion_type=1;(Chain) set completion_type=2;(Release) |
也可以通过语句查询当前配置
|
show variables like '%autocommit%' ; show variables like '%completion%' ; |
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默认打开了autocommit,那么我想验证下在无显示事务的情况下(即无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 completion_type=1;(chain),也就是说无论几个"张飞"在还没提交之前,都是一个事务。
代码与上面的一样。
|
mysql> SET @@completion_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 completion_type=1(chain),相当与在第一个"张飞"前加了begin,所以第二个"张飞"由于触发了主键约束所以导致事务失败,插入数据失败。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持开心学习网。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://www.qttc.net/175-mysql-autocommit.html
- mysql索引优化技巧(MySQL如何优化索引)
- mysql支持存储表情(MySQL如何插入Emoji表情)
- mysql常用存储方案及基本原理(详解分析MySQL8.0的内存消耗)
- mysql多核cpu利用(mysql CPU高负载问题排查)
- mysql索引失效的几种情况(Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题)
- mysql缓存是什么(详解mysql查询缓存简单使用)
- mysql的null值跟空值(你知道mysql中空值和null值的区别吗)
- python中怎么连接mysql(python远程连接MySQL数据库)
- 怎么将mysql彻底卸载(如何把Mysql卸载干净亲测有效)
- mysql分区怎么实现(MySql分表、分库、分片和分区知识深入详解)
- mysql自增锁(深入剖析 MySQL 自增锁)
- mysql8.0关键字段使用(MySQL 8.0新特性之隐藏字段的深入讲解)
- 适合小白入门的mysql教程索引简介(一篇带给你MySQL高性能索引)
- mysqlint后面的4是什么意思(MySQL中intn后面的n到底代表的是什么意思)
- ubuntu下mysql安装教程(Ubuntu 20.04 安装和配置MySql5.7的详细教程)
- django mysql设置(Django框架使用mysql视图操作示例)
- 梁山创始人杜迁,为何不受宋江待见,只排名83位(梁山创始人杜迁)
- 法国面包(法国面包法棍)
- 微信(微信分身)
- 双十二(双十二和双十一哪个划算)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
热门推荐
- sqlserver查看数据表更新时间(SQL Server实现显示每个类别最新更新数据的方法)
- mysql添加数据很慢(mysql如何优化插入记录速度)
- nginx虚拟主机配置推荐(nginx配置虚拟主机的详细步骤)
- css鼠标点击效果怎么样(CSS实现鼠标滑过鼠标点击代码写法)
- 微信发送镭射效果代码(JS实现微信"炸屎"大作战功能)
- python图像变换教程(详解python-图像处理映射变换)
- laravel事务状态(laravel dingo API返回自定义错误信息的实例)
- 前端实现一个自适应的正方形(前端实现背景虚化但内容清晰且自适应 的实例代码)
- nginx配置两个前端web服务(你真的了解如何将Nginx配置为Web服务器吗)
- docker 查看目录映射(docker 文件存放路径, 修改端口映射操作方式)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9