事务特性
原子性(Atomicity)
事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
比如张三给李四转账,张三的账户扣款成功,李四的账户增加款项,这两个操作,要么都成功,要么都失败。
一致性(Consistency)
事务完成时,必须使所有的数据都保持一致状态。
比如转账,完成时张三和李四的余额总数是不变的。
隔离性(Isolation)
数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability)
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
比如转账后,张三和李四的余额数据落盘。
并发事务的问题
脏读
一个事务读到另外一个事务还没有提交的数据。
不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同。
幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。
事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
表格从上至下,隔离级别越高,数据越安全,但是性能越低。
MySQL默认的隔离级别是Repeatable Read。
隔离级别Demo
脏读
设置隔离级别为 Read Uncommitted,会出现脏读。
不可重复读
设置隔离级别为 Read Committed,不会出现脏读,会出现不可重复读。
解决不可重复读
设置隔离级别为 Repeatable Read,可以解决不可重复读。
幻读
查询没有数据,但是插入提示主键重复。
解决幻读
设置隔离级别为 Serializable,可以解决幻读。