定义
事务是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性。
示例;转账有a-钱 b+钱两个动作,两个语句必须都成功才算转正成功。
事务给我们提供了一个返回的机会。
Mysql如何管理事务
- MySQL默认是开启事务的(自动开启)
默认事务开启的作用:当我们去执行一个sql语句的时候,效果会立即体现出来。
自动提交:autocommit=1
手动提交:commit;
事务回滚:rollback;
数据准备
事务控制回滚 rollback
事务回滚:撤销sql语句执行效果
调用rollback无效,当前数据库无法回滚。
方法:设置mysql的自动提交为false(set autocommit=0),关闭了mysql的自动提交。
再插入一条。
再调用rollback,生效了。
原理上其实那条插入值语句并没有生效。系统只是显示插入效果。要想生效则需要commit。此时再rollback无效。
手动开启事务
先把autocommit还原为1.
begin;/start transaction;帮我们手动开启一个事务
转账: a—b 100;
因为开启了自动提交commit,此时rollback无效。
再转账,但是在前面加一个begin;
begin;
update user set money = money-100 where name='a';
update user set money = money+100 where name='b';
rollback生效了。完成后可以用commit提交事务。再之后就不可以回滚了。
事务特征
A 原子性:事务是最小的单位,不能再分割
C 一致性:事务要求,同一事务中的SQL语句,必须保证同时成功或者同时失败
I 隔离型:事务1和事务2之间是具有隔离性的。
D 持久性:事务一旦结束(commit,rollback),就不可以返回
事务开启:
- 修改默认提交 set autocommit = 0;
- begin;
- start transaction;
事务手动提交
commit;
事务手动回滚
rollback;
事务的隔离性:
- read uncommitted;读未提交的
- read committed;读可以提交的
- repeatable read;可以重复读
- serializable;串行化
read uncommitted;读未提交的
如果有事务a和事务b,a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a操作的结果。这就出现了脏读。
脏读:一个事务读到了另一个事务还没有提交的数据。
实际开发不允许脏读出现。
read committed;
改变隔离级别后,发现就算可以读到对方已经提交的,还是有问题。
出现了不可重复读现象。意思是加入我已经读了数据,然后我没接着操作,暂停了一会,但是其他人用别的事务操作了这个数据,我再接着操作其实不是我刚才读了数据,是更新后的数据。
幻读
repeated-read可以解决前面的问题,但是出现 了幻读。另外一个人提交的这边看不到。