ACID
- Atomic 可以看成是过程的原子性
- Consistency 可以看成是 结果的原子性
隔离级别
- 读未提交
- 事务A可以读事务B未提交的更新
- 读已提交(不可重复读)
- 事务A只能读到事务B已提交的更新
- 但是事务A在事务内读到的相同数据对应的值可能不一样(由于事务B的提交对该数据进行了更新)
- 可重复读
- 事务A在事务内读到的相同数据对应的值都是一样的,即使事务B的提交对其进行了更新
- 可重复读的现象针对更新操作
- 串行化
- 由于事务被串行(只有上一次事务 commit 了,下一个事务才能执行),事务间的修改、增删都不会影响了
- 解决幻读
- 幻读就是事务A的相同查询获得的查询集,由于事务B的插入/删除导致查询集大小不一致
- 幻读的现象针对插入/删除操作
MySQl 的隔离级别
- MySQL 对每个事务都有自己的事务id,这个 id 自增,全局唯一
- innodb 存储引擎,会在每行数据的最后加两个隐藏列,一个保存行的创建时间(其实是新增操作的事务id),一个保存行的删除时间(其实是进行删除操作的事务id)
- 一个事务进行查询时,查询到的记录要求是前面的事务或者自己事务所创建的,所以要求对应记录的创建时间的事务id要 <= 当前事务id;并且查询到的记录要么是没被删除,要么是被当前事务开启后所删除,所以要求对应记录的删除时间的事务id为空或者 > 当前事务id
- 当一个事务对记录进行了修改,那么对应记录会生成一个副本(即在 innodb 存储引擎中新创建一行),原来记录的删除时间设置为新的事务的id,副本的创建时间设置为新的事务的id
- 读取原来记录的事务,就不会读取到副本的内容(因为副本的创建时间的事务id大于当前事务的id,并且删除时间的事务id比当前事务大)