DataBase 事务
代表单个工作单元的一组SQL语句,在事务中的语句都应成功完成。
属性(ACID):
- 原子性(Atomicity) 事务不可中断,要么事务中所有语句被执行,要么事务被退回,执行的更改被撤销
- 一致性(Consistency) 数据库状态保持一致
- 隔离性质(Isolation) 事务之间彼此不受干扰,且一次只有一个事务可更新同样的数据(互斥)
- 持久性(Durability) 事务产生的更改是永久的
创建事务
1 | START TRANSACTION; -- 开启事务 |
常见并发问题
- 脏读(Dirty Reads)
- 事务读取了尚未被提交的数据
- 不可重复读(Non-repeating Reads)
- 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致
- 幻读(Phantom Reads)
- 事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行
- 丢失更新
- 同时有多个事务更新同样的数据,后提交的事务覆盖先前的事务
- 死锁
- 多个事务拿着不同事务需要更新数据的锁
- 出现原因:
- 多个事务里对于同样的数据采用相反顺序进行更新
- 解决方案:
- 更新多条记录时采用相同顺序
- 简化事务,缩小事务运行时长
- 安排运行时长长的事务(基于大表)在非高峰时段进行
事务隔离级别
设置事务隔离级别
1 | SHOW VARIABLES LIKE 'transaction_isolation'; -- 查看数据库的事务隔离级别 |
- 读未提交(READ UNCOMMITED)
- 读已提交(READ COMMITED)
- 可重复读(REPEATABLE READ)
- 序列化(SERIALIZABLE) 只在解决幻读问题的情况下使用该级别
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Crayz's Blog!