事务四大特性
- 原子性:要么全部成功,要么全部失败。
- 一致性:事务前后,数据库的完整性约束没有遭到破坏。
- 隔离性:每个读写事务与其他事务互相分离,互不可见。
- 持久性:事务一旦提交,则其结果就是永久性的。
四大隔离级别
- read uncommitted(读未提交):一个事务读取到其他事务未提交的数据,此现象称为脏读。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务 | |
2 | 开启事务 | |
3 | 查询数据“张三”,(1,“张三”,18) | |
4 | 修改数据张三,values (1,"张三“,20) | |
5 | 查询数据“张三”,(1,“张三”,20) |
- read committed(读提交):一个事务读取到另一个事务提交前后的数据,两次数据不一致。此现象称为不可重复读。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务 | |
2 | 开启事务 | |
3 | 查询数据“张三”,(1,“张三”,18) | |
4 | 修改数据张三,values (1,"张三“,20) | |
5 | 提交事务 | |
6 | 查询数据“张三”,(1,“张三”,20) |
- repeatable read(可重复读):在同一个事务里,select的结果都是事务开始时时间点的状态,同样的操作每次读取都是一致的。mysql的默认隔离级别。可能会出现幻读。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务 | |
2 | 开启事务 | |
3 | 查询数据“张三”,不存在 | |
4 | 插入数据张三, insert into test(id,name) values (1,"张三“) | |
5 | 提交事务 | |
6 | 查询数据“张三”,不存在 | |
7 | 插入数据张三, insert into test(id,name) values (1,"张三“),报错 |
时间节点7插入时,报主键冲突错误。
- serializable(序列化): 该隔离级别下,事务都是串行顺序执行的,并非性最低。mysql数据库的innodb引擎会给读操作隐式加一把共享锁,从而避免了脏读,不可重复读,幻读的出现。
四种隔离级别情况下产生的问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可以出现 | 可以出现 | 可以出现 |
读提交 | 不可以出现 | 可以出现 | 可以出现 |
可重复读 | 不可以出现 | 不可以出现 | 可以出现 |
序列化 | 不可以出现 | 不可以出现 | 不可以出现 |