前言
事务是mysql Innodb引擎的一大特点,可以说,在日常开发中,对于mysql事务的使用无处不在,因此深入了解并掌握mysql的事务原理很有必要。
一、mysql事务简介
- 事务 是一组操作集合,一个不可分割的工作单位;
- 事务会将所有操作作为一个整体,一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败;
比如 : 张三给李四转账1000块钱,张三银行账户减少1000元,而李四银行账户的钱要增加1000元。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败
二、事务四大特性
是事务的四大特性,简称ACID
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;
三、事务案例演示
下面来模拟一个事务操作,准备如下一张表,并初始化两条数据,来模拟转账的事务操作;
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 = '李四';
执行完成后,可以看到效果是预期的;
2)测试异常情况
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三余额减1000
update account set money = money - 1000 where name = '张三';
1/0
-- 3. 李四余额加1000
update account set money = money + 1000 where name = '李四';
由于这个语句中出现了一个不符合sql语法的错误,执行到1/0的时候报错,导致第三步无法正常执行,最终的结果如下,即张三扣减了1000,但是李四并没有加1000,即数据在操作前后不一致了;
基于上面产生的异常情况,在实际开发过程中,假如是运行在程序中的,为了避免出现这样的问题,就需要通过事务来进行控制;
通过事务控制
在操作之前,我们需要了解下面两个命令
1、查看当前的事务提交方式
SELECT @@autocommit ;
“1”表示自动提交,即在默认情况下,事务是自动提交的,为了模拟事务的效果,我们需要修改下这个事务的自动提交方式;