目录
思维导图:
03|事务隔离:为什么你改了我还看不见? | 八九. | 思维导图(新) | ProcessOn
密码:aFH2
简单概念
事务就是要保证一组数据库操作,要么全部成功,要么全是失败,在mysql中,事务支持的实现都是在引擎层实现的。mysql是一个支持多引擎的系统,但并不是所有引擎都支持事务,录入myisam原生引擎就不支持事务,这也是它被innoDB取代的原因
一.隔离性与隔离级别
事务的四大特性:原子性,一致性,隔离性,持久性
1.隔离性
读未提交:一个事务还没提交的时候,他做的变更数据就能被别的事务看到
读已提交:一个事务提交之后,它做的变更才会被其他事务看到
可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的
串行化:顾名思义就是对于同一行记录,写会加写锁,读会加读锁,当出现读锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行
2.四种隔离级别的具体区别
2.读提交:V1=1,V2=2,事务B的更新在提交之后才能被A看到,所以V3也是2
3.可重复读:V1,V2=1,V3=2.之所以V2还是1.遵循的就是这个要求,事务在执行期间看到的数据前后必须保持一致
4.串行化:事务B执行将1改成2的时候会被锁住,直到事务A提交之后,事务B才可以继续执行
oracle和mysql的默认不一致隔离级别不一致,需要注意
每个隔离级别存在都有自己的意义:可重复读的话,比如说你在校对这个月和上个月的数据的时候,如果现在又有数据的修改,你不希望影响到你现在校对的结果,那就要使用可重复读
3.四种隔离级别的实现
2.读已提交:在 sql语句开始执行的时候创建一个视图。整个事务存在的期间都是在用这个视图
3.可重复读:在 事务启动的时候创建一个视图。整个事务存在的期间都在用这个视图
4.串行化:使用直接枷锁的方式来避免并行访问
二.事务的回滚与长事务
回滚段指的是回滚回去,不是说现在要修改的值,我一直处在思维误区,
看了好久才明白这张图想说明的是什么意思,脑壳不够用
同时你会发现,即使现在有另外一个事务正在将4改成5,这个事务跟
A,B,C对应的事务是不会冲突的
1.回滚日志
当没有事务在需要用到这些回滚日志的时候,回滚日志会被删除
什么时候判断能否删除:当系统中没有比这个回滚日志更早的read=view时候,
还有一种说法是,其他事务不用这个这个事务回滚时候,放入待清理的链表中
2.长事务
意味着系统里面会存在很老的事务视图,这个事务随时可以访问数据库里的任何数据
缺点:印象回滚段,占用所资源(后面会说明)
三.事务的启动方式
1.mysql事务的启动方式
1.显式启动事务语句:begin或者start transaction,配套的语句是commit,回滚的语句是rollback
2.应如何正确启动事务
set autocommit=1,通过显示语句来启动事务
提交的方式可以采用commit work and chain (自动提交这个事务,并进入下一个事务)