事务特性
- 原子性
事务中的任何一个操作,只要有一个失败,则都失败 - 一致性
事务成功后,数据库的状态和他的业务规则一致,数据保持一致 - 隔离性
当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 - 持久性
事务一旦提交,必须持久化到数据库中
并发问题(不考虑事务)
- 读脏数据:A事务读取B事务未提交的数据
- 不可重复读:A事务两次读取数据产生不同的结果(B事务中途提交了修改或删除任务) 解决:需要加行级锁
- 幻读::A事务两次读取数据产生不同的结果(B事务中途提交了新增任务) 解决:需要加表级锁
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
锁
按照锁定对象划分
- 表锁定
- 行锁定
按照锁定关系划分
- 共享锁
独占锁
共享锁定防止独占锁定,允许其他共享锁定
独占锁定防止其他独占锁定,和共享锁定
事务隔离级别
在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。