事务就是要保证一组数据库操作,要么全部成功,要么全部失败,在MySQL中,事务支持是在引擎层实现的
优点:支持严格的ACID属性(原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability))
原子性(atomicity):构成事务的所有操作,要么全部执行,要么全部不执行,不可能会出现一部分成功一部分失败的情况
一致性(consistency):在事务执行前后,数据库一致性没有被破坏
隔离性(isolation):数据库中的事务一般是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态,通过配置事务隔离级别可以避免脏读、重复读等问题
持久性(durability):事务完成后,该事务对数据的更改会被持久化到数据库不会被回滚
事务A | 事务B |
---|---|
select * from user; | |
insert into user(username) values('张三'); | |
select * from user; 张三 |
事务A | 事务B |
---|---|
select * from user; | |
insert into user(username) values('张三'); | |
select * from user; | |
commit; | |
select * from user; 张三 |
事务A | 事务B |
---|---|
select * from user; | |
insert into user(username) values('张三'); | |
commit; | |
select * from user; |
事务A | 事务B |
---|---|
select * from user; | |
insert into user(username) values('张三'); | |
select * from user; | |
commit; | |
张三 |
什么是脏读?
事务A | 事务B |
---|---|
将n修改 n=1 | |
读取到修改的数据 n=1 | |
事务提交 |
事务B读取未提交的事务,这就是脏读
什么是不可重复读?
事务A | 事务B |
---|---|
获取 n=0 | |
将n修改 n=1 | |
事务提交 | |
获取 n=1 |
事务A两次读取的数据不同,就是不可重复读
什么是幻读?
事务A | 事务B |
---|---|
将n修改n=1 | |
读取到修改的数据 n=1 | |
事务提交 |
各类事务级别在面对并发情况下的情况 | | 脏读 | 不可重复读 | 幻读 | | --- | --- | --- | --- | | 读未提交 | √ | √ | √ | | 读已提交 | × | √ | √ | | 可重复读 | × | × | √ | | 串行化 | × | × | × |