Mysql-事务 笔记

原文地址:http://www.zsythink.net/archives/1204

     http://www.zsythink.net/archives/1216

     http://www.zsythink.net/archives/1233

原文讲的很详细,以下为个人理解笔记。

概述
事务的ACID四大特性
A:atomicity 原子性   整个事务中的所有操作要么全部执行成功,要么全部执行失败后回滚到最初状态
B:consistency 一致性  数据库中式从一个一致性状态转为另一个一致性状态
C:isolation 隔离性 一个事务在提交前所做的操作是否能为其他事务课件,由于不同的场景需求不同,所以针对隔离性来说,有不同的隔离级别
D:durability 持久性 事务一旦提交,事务所做出的修改将会永久保存,此时即使数据库崩溃,修改的数据也不会丢失,
 
事务日志可分为redo log 和undo log
1、redo log :
         mysql会将事务中的sql语句涉及到的所有数据操作先记录到redo log中,然后再将操作从redo log中同步到对应的数据文件中。例如修改50条数据,现将此操作记录到redo log中,然后再从redo log中一条一条同步到数据文件对应的记录中,即使出现打断比如停电,那么依靠redo log中的日志将剩余部分操作再次痛不痛对应的数据文件中。
2、undo log:
        可以理解为数据修改之前的备份,比如事务进行到一半,有一条未执行成功,发生回滚,则需要根据undo log进行撤销,将修改过的数据从逻辑上恢复到修改之前的样子,
注:undo log 是逻辑日志,与redo log记录的页操作屋里日志不同
3、log group:
    重做日志组,一个重做日志组中有多个重做日志文件,也就是多个redo log file。当日志组中的第一个log file被写满,则会将redo log写入到日志组中的下一个重做日志文件中,以此类推。如果全部被写满,则将redo log 再写入到第一个redo log file中覆盖原来的redo log,以便新的redo log 被写入。
 
 
        
 
 
 
事务的4种隔离级别
1、READ-UNCOMMITTED: 读未提交
       事务1位提交,事务2就可以看到事务1 所做的修改
当前事务能够看到其他事务中未提交的数据,这种现象叫做脏读。同时也会出现幻读和不可重读的问题。
 
此隔离级别并发是最强的,但是隔离性和安全性是最差的。 
 
2、READ-COMMITTED:读已提交或者读提交
        事务1未提交,事务2 无法看到事务1中的修改,而当事务1提交后,事务2中即可看到事务1中的修改。
会出现幻读问题和不可重读问题(注:不可重读不要理解为一定不可重读,可以理解为不一定可重读)
幻读出现为事务2 的多次读取,然后事务1 在此期间已提交了插入或者删除操作
不可重读是在事务2 多次读取,事务1在此期间提交了修改操作
两者在某些地方均叫做幻读,而且mysql官方文档也将不可重读归为幻读,只是单价为了更加细化他们的区别。
 
3、REPEATABLE-READ:可重读     
        事务1提交了,事务2 在未提交之前事务2中查到的数据是相同的。
 此级别会出现幻读问题。
 
4、SERIALIZABLE:串行化 
        事务1未提交事务2的查询语句被阻塞   
不会出现幻读的问题,但失去了并发的能力,此隔离国域严格,所以很少讲隔离级别设置为串行化
 
 
 
总结脏读、幻读、不可重读的区别
脏读:当前事务可以查到别的事务未提交的数据(侧重点在于别的事务未提交)
幻读:幻读的表象与不可重读的表象都让人懵逼,很容易混淆,但是如果细分则可以理解为幻读侧重于数据的新增和删除,标示在同一事务中,使用相同的查询语句,第二次查询时,莫明多出来一些之前不存在的数据,或者莫明的不见了一些数据
不可重读:不可重读的侧重点在于更新修改数据,标示在同一事务中,查询相同的数据范围是,同一个数据资源莫明的改变了。
posted @ 2019-10-12 11:59  不负_时光  阅读(125)  评论(0编辑  收藏  举报