Mysql中事务是什么?有什么用?

通过这一篇文章让你彻底了解事务,文章当中提供了很多真实示例,供大家参考学习!
目录一、什么是事务?事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作 作为一个整体一起向系统提交 或 撤销操作请求,即这些操作要么同时成功,要么同时失败 。
在关系数据库中,一个事务可以是一条SQL语句,或者一组SQL语句;
在JAVA当中,一个事务可以是一个接口,也可以是service层当中的一个方法;
举例:张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000 。这一组操作就必须在一个事务的范围内,要么都成功,要么都失败 。

Mysql中事务是什么?有什么用?

文章插图
 
正常情况:转账这个操作, 需要分为以下这么三步来完成
Mysql中事务是什么?有什么用?

文章插图
 
异常情况:转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了 。
Mysql中事务是什么?有什么用?

文章插图
 
为了解决上述的问题,就需要通过数据的事务来完成,我们只需要 在业务逻辑执行之前开启事务,执行完毕后提交事务 。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态  。
Mysql中事务是什么?有什么用?

文章插图
 
注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务 。
二、事务操作光说不练肯定不行,下面我们通过sql来演示以上场景,首先演示没有事务的情况,然后再演示通过事务来控制的情况 。事务控制mysql当中有两种方式,我们分别进行演示 。
数据准备:DROP TABLE IF EXISTS account;CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID', NAME VARCHAR ( 10 ) COMMENT '姓名', money DOUBLE ( 10, 2 ) COMMENT '余额' ) COMMENT '账户表';INSERT INTO account ( NAME, money ) VALUES ( '张三', 2000 ),( '李四', 2000 );1、没有事务会出现什么场景?(1) 测试正常情况-- 1. 查询张三余额 select * from account where name = '张三'; -- 2. 张三的余额减少1000 update account set money = money - 1000 where name = '张三'; -- 3. 李四的余额增加1000 update account set money = money + 1000 where name = '李四';
Mysql中事务是什么?有什么用?

文章插图
 
(2) 测试异常情况UPDATE account set money = 2000;-- 1. 查询张三余额 select * from account where name = '张三'; -- 2. 张三的余额减少1000 update account set money = money - 1000 where name = '张三'; 出错了.... (这里是故意整的不加注释,来模仿执行当前事务执行到中间报错了)-- 3. 李四的余额增加1000 update account set money = money + 1000 where name = '李四';我们把数据都恢复到2000,然后再次一次性执行上述的SQL语句(出错了… 这句话不符合SQL语 法,执行就会报错),检查最终的数据情况, 发现数据在操作前后不一致了 。
Mysql中事务是什么?有什么用?

文章插图
 
2、控制事务方式一(手动提交)mysql当中的事务默认是自动提交,什么是自动提交?
所谓自动提交就是每执行一条sql就进行提交一次 。而实际我们在开发当中,往往会出现上面类似业务,多条sql同时执行,还要保证要么都成功要么都失败 。而在java当中我们并没有看到过什么commit提交事务,什么rollback回滚事务的相关sql,这是因为我们使用的持久层框架都进行了封装,例如MyBatis默认就是手动提交事务 。而他的commit和rollback全权由框架来管控 。


推荐阅读