文章目录
- 事务: 将不可分割的多个联合的SQL操作 --> 事务;
- 每个单独的SQL可以看作是一个事务,事务只对DML(数据操控语句)起作用,对DQL(数据查询语句)无效;
ACID
- 原子性(Atomicity): 事务要么成功,要么失败;
- 一致性(Consistency):动态平衡;
- 隔离性(Isolation):互不干扰;
- 持久性(Durability):不可回退;
事务的使用
事务开启
- start transaction;
事务回滚
- commit;
事务提交
- rollback;
并发问题
脏读
- 事务A读到了事务B还没有提交的数据
- 事务设置未提交可读隔离级别,但一事务被修改,但未提交,此时可以回滚;
不可重复读
- 在一个事务里面读取了两次某个数据,读出来的数据不一致
- 一个事务第一次被访问时,另一事务未对其数据做出修改,第二次访问,另一事务已做修改,前后查询数据不一致;
幻读
- 在一个事务里面的操作中发现了未被操作的数据
- 设置事务重复读,但事务修改时,其它事务无法访问,但能添加字段,最后却查询到前面未查询到的新数据;
事务隔离级别
- select @@tx_isolation --> 查询当前事务级别
default
- 默认隔离级别,各数据库默认值不一样;
read_uncommitted
- 读未提交,容易导致脏读;
read_committed
- 读已提交,解决不可重复读;
repeatable_read
- 重复读: 对某一事务的数据加锁,这个事务未结束,其它事务对他现有字段数据不能进行修改,但可以添加其它字段,所以解决了脏读,不可重复读,但未解决幻读;
serlalizable
- 串行化, 解决幻读;
对应关系
事务类型 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read_uncommitted(读未提交) | 是 | 是 | 是 |
read_committed(读已提交) | 否 | 是 | 是 |
repeatable_read(重复读) | 否 | 否 | 是 |
serlalizable(串行化) | 否 | 否 | 否 |
- 是否存在问题