一、什么是事务,四大特性
事务:一组操作的集合,它是一个不可分割的单位,事务会将这些操作作为一个整体一起像系统提交,这些操作要么同时成功,要么同时失败
四大特性(ACID)
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都成功,要么都失败
- 一致性(Consistency):事务前后数据的完整性必须保持一致。
- 隔离性(Isolation):各个事务的操作不受干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):事务一旦提交,它对数据库中数据的改变就是永久性的
比如,A向B转账500元。
原子性:都成功,或者都失败
一致性:A扣减了500元,B必须增加500元
隔离性:A向B转账的过程中,不受其它事务干扰
持久性:事务提交后,要落盘(持久化)
二、并发事务可能出现的问题
脏读:一个事务读到另一个还未提交事务的数据
不可重复读:一个事务先后读取同一个事务两次,得到的数据不一致
幻读:一个事务在查询时没发现该数据,插入时却又发现该事务已存在,类似“幻影”
比如,现在有A、B两个事务
脏读:A修改了一个数据,但是还没有提交。但在并发情况下被B读取了还未提交的数据,也就是“脏数据”,依据脏数据所做的操作可能是不正确的
不可重复读:A查询当前数据后,被B修改了该数据,A重新查询该数据发现两次结果不一致
幻读:A查询一些数据后发现并不存在,同时B插入了一部分数据,在随后的操作中,A发现不该存在的数据突然出现了,就像出现了“幻影”一样。
三、事务隔离级别
Mysql默认隔离级别为:可重复读
读未提交(read uncommitted):解决不了所有问题,一般不用
读已提交(read committed):解决脏读
可重复读 (repetable read):解决脏读和不可重复度
串行化(serializable):解决所有,事务串行执行,效率低