mysql事务的四大特性
- 原子性:事务开始后所有操作,要么全部做完,要么全部不做。如果事务执行过程中出现异常,会回滚到事务开始前的状态。
- 一致性:事务执行的结果必须是使数据从一个一致性状态变到另一个一致性状态。比如说银行转账案例,A向B转账,不可能A扣了钱,B却没收到。
- 持久性:事务一旦提交,它对数据库中数据的改变就应该是永久性的。即使服务器宕机获取因其他网络问题而断开链接,当mysql服务重启时,也会根据重做日志进行数据恢复
- 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
转载至:https://blog.csdn.net/kking_edc/article/details/108723408
隔离级别
- 读取未提交
- 读取已提交
- 可重复读取
- 串行化
mysql读取问题
- 脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据
- 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读
- 幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
隔离级别与读取问题的关系
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读取未提交 | 可能 | 可能 | 可能 |
读取已提交 | 不可能 | 可能 | 可能 |
可重复读取 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
事务隔离级别的实现
- RU级别(读取未提交):主要通过回滚日志和重做日志实现
- RC级别(读取已提交):主要通过排它锁实现,在未提交事务之前,不允许其他事务影响到当前事务事件
- RR级别(可重复读取):为了解决不可重复读,或者为了实现可重复读,MySQL 采用了 MVVC (多版本并发控制) 的方式。
对于一个快照来说,它能够读到那些版本数据,要遵循以下规则:
3.1. 当前事务内的更新,可以读到;
3.2. 版本未提交,不能读到;
3.3. 版本已提交,但是却在快照创建后提交的,不能读到;
3.4. 版本已提交,且是在快照创建前提交的,可以读到;
利用上面的规则,再返回去套用到读提交和可重复读的那两张图上就很清晰了。还是要强调,两者主要的区别就是在快照的创建上,可重复读仅在事务开始是创建一次,而读提交每次执行语句的时候都要重新创建一次。 - 串行化:主要通过排它锁实现,且同一时间仅允许一个事务对同一行数据进行操作