00:00
好,下面呢,我们再来看事物的第四个属性,叫做事物的隔离级别,好,这个东西大家应该再学习my circle的时候应该都听说过,对吧?啊,事物呢,有四大特性,分别是acid啊,原子性,一致性,隔离性,还有持久性。好,然后这个隔离级别呢,它就跟持久性有关啊,因为在我们就比如说我们现在有并发的多个事物要同时进行处理,那我们当前的每一个事物之间呢,它都不会相互影响,当然呢,我们的这个他们之间的隔离程度呢,就要通过我们的事物的隔离级别呢来进行设置了,好就比如说咱们事物的隔离级别呢,一共有四种,分别是读未提交,读已提交,可重复读,然后还有串行化啊,他们几个分别是什么意思呢?大家注意,比如说呀,读未提交。啊,我们现在呢,咱们有两个事物,一个叫A并发的事物啊,一个叫A,一个叫B,然后我现在我的A事物它的隔离级别呢是读未提交,而B事物咱们没有设置它的隔离级别,那咱们就要看数据库默认的隔离级别了,就比如说咱们就拿着MYSQ来说,MYSQL里面默认的隔离级别是可重复读,那所以说B的默认的隔离级别就是可重复读,那我们现在呢,如果A是读未提交的话,就表示当前在A事物中能够读到B中没有提交的事物,没有提交的数据。
01:25
就比如说咱们的B里面呢,大家注意啊,然后我们现在呢,然后咱们去这个,呃,添加了一条新的数据,对吧,我添加了一个ID等于十的用户信息,ID等于十的用户信息,对吧?好,然后那我现在我的A里面,它就能够读到我们当前咱们的这个B里面啊,这个添加的这个ID等于十的用户信息,虽然说B还没有提交15,咱们同样也能读出来啊好,然后呢,所以说呢,读未提交它就会出现一些问题,就比如说呀,那我们现在如果B最终它没有提交事物,而是回滚的事物,对吧?那大家说你读出来的这个ID等于十的数据,它有意义吗?没有任何意义,所以说这个时候,然后我们的读未提交所出现的问题呢,就是脏读啊,脏读就是读取出来的数据没有任何意义啊。
02:15
好,然后下面呢,我们再来看,然后我们看一下独一提交,那什么叫独一提交呢?比如说同样是A和B2个事物,A的事物的隔离级别是独一提交,那我们的A里面就只能读到B事务中已经提交的数据。OK吗?那比如说B里面,咱们现在开启了一个新的事物,我在这里面呢,我也是同样来添加了一个用户信息,对吧?好,那我们当前的A能读到B里面添加的这个用户信息吗?没有,只有当我们的B,然后当他把我们的这个事物提交之后,咱们的A他才能读取得到。好,那这个时候大家说读一提交出现的问题是啥?是不是有可能我们这一次读取出来的数据跟上一次读取出来的是不一样的,也就是说在我们并没有提交事物的时候,你读取出来的跟B已经提交事物,然后读取出来的数据是不一样的,所以说读已提交所出现的问题叫做不可重复读。
03:13
下面呢,我们再来看第三个,可重复读。那可重复读来解决的是啥问题啊?那不就是不可重复读的问题吗?好,那可重复读是什么意思?比如说我们现在呢,咱们还是有两个事物,然后这两个事物它默认都是可重复读,对吧?那我们现在呢,比如说大家看好我的A,然后当他再去操作某一条数据的时候,比如说咱们操作的是ID等于一的这条数据,好,然后呢,A就会将我们当前的这条数据来进行加锁,加锁的意思就是别的事物是无法进行操作的,比如说B现在他也想操作ID为一的这条数据,那他就会一直处于阻塞状态,直到我们当前的这个A呢,然后他提交了失误之后,B才能继续处理,OK吧,好,然后但是呢,大家一定要看好了,那虽然说我们是对ID等于一的数据加了锁,但是我们其他数据加锁了吗?没有,我们对表加锁了吗?没有,所以说B它仍然是可以去操作其他数据,或者说是往咱们的表里面去添加一些新的数据的,OK吧,好,那这个时候如果B它往咱们的这个表里。
04:24
里面添加了一些新的数据,那大家说A它是不是就能够读到,然后读到之后呢,我明明是把数据加了锁,但是咱们读取出来的数据可能还是有些区别,所以这个时候它所出现的问题就是换读,大家听好啊,可重复读也会出现相关的问题,叫什么叫换读?好,然后大家注意,但是我们的my circle这个数据库呀,然后它比较的特殊,它的可重复读呢,避免了换读的情况,什么叫避免了换读的情况呢?大家注意,就是说我们在当前咱们的两个可重复读的这个这个事物中呢,然后我们在每一个事物中,你都能都只能来读到我们当前事物中的操作,就比如说B事物中的操作,你能读得到吗?读不到,然后所以说我们当前咱们的这个可重复读。
05:14
它就能够保证我们在一次事务中你所读取到的数据一定是你当前事务中所操作之后的结果,OK吧,所以说MYSQ中为什么它的默认的隔离级别是可重复读呀,就是因为这个可重复读呀,它解决了换读的问题,OK吧,所以说它就是它是我们MYSQ中最理想的一种隔离级别啊,好,然后最后一个叫串行化,那串行化的话,大家注意你看,然后我们当前咱们的这个事物呀,然后可以多次从一张表中读取到相同的行,然后在我们的这个TRANS01执行期间,禁止其他事物对这个表来进行添加、更新、删除操作。也就是说我的A事物如果说它的隔离级别是串行化,那所以这个时候它就可以干嘛将我们当前的表进行加速,那其他的事物能对当前这个表进行操作吗?不能。
06:07
那如果他要操作就得处于阻塞状态,等到我们的A操作完之后,其他的事物才能够继续操作,OK吧,所以说这个东西虽然说呀,他可以来避免咱们任何的并发问题,但是它的性能非常的低,所以说一般情况下,我们这个都这个只有在一些特殊的情况下才会用这个串行化啊,那我们一般呢,咱们用的也都是这个默认的隔离级别,叫做可重复读,哎,这个大家注意啊,行,然后呢,下面呢,我们再往下看,然后咱们来看一下各个隔离级别解决并发问题的能力,也就是我们刚才所说的那几个问题,脏毒,不可重复读换读,其实我们的隔离级别越低,它出现的问题越多,就像是咱们的读未提交,它会出现脏毒,那它也一定会出现不可重复读和换读,换句话来说,你的隔离级别越高,我们的每一个更高层次的隔离级别就是来解决我们当前上一个隔离级别所出现的问题的。就比如说你的独位提交。
07:07
他有这三个问题,而咱们的读已提交,解决了什么脏读的问题?我们的可重复读来解决的是什么?解决的是不可重复读的问题,而我们当前咱们的序列化,也就是串行化来解决的是换读的问题,OK吧,好,然后但是在我们的my circle里面,大家注意啊,然后my circle中的可重复读这个换读它也是不会发生的,知道吧,所以说my circleq中默认的隔离级别就是可重复读啊,好,那当然咱们的每一种数据库呢,对咱们的事物的隔离级别的支持程度都不一样,就比如说Oracle里面,它的隔离级别一共只有俩,一个叫独一提交,一个叫做序列化,默认的隔离级别呢,就是独一提交,而my circlele里面这四种都有,默认的是什么?可重复读?咱们刚才已经说过了,它避免了换读啊。好,那我们现在如果要通过声明式事物来设置隔离级别,咱们怎么设置?大家注意来找到我们的这个注解来使用哪个属性叫isolation属性。
08:10
看好啊,叫做isolation属性,然后这个属性是什么类型,是isolation类型的,然后这个东西是什么?大家注意这是个枚句,然后我们现在把它给点开,大家注意你看啊,这里面有几个值,首先第一个,那大家都知道枚举类里面的数据是不是都是罗列出来的,对不对,像这个是默认,然后这个是读未提交,这个是读已提交,然后这个是可重复读,然后这个是序列化。OK吧,那所以咱们要想来设置隔离级别,怎么设置,大家说啊,用isolation,然后加上点我们当前的枚举项就可以啊,能看懂吧,但是一般情况下咱们用的也都是谁呀,点default默认的隔离级别其实就是我们当前数据库中所使用的默认的隔离级别,OK吧,行,这个大家注意。
09:01
好,那这是咱们这个事物属性,这个是我们这个,呃,第四个事物属性叫做事物的隔离级别啊,然后大家呢,也可以跟咱们之前呢,对吧,大家一块儿去思考一下,其实这些东西我们都不需要去设置,对吧,它都有默认值,我们也只是在一些比较特殊的情况下,咱们才需要去设置的啊好OK。
我来说两句