00:00
我们来看事物的隔离级别,就是说如果多个并发事物,这个时候容易发生什么问题?对于同时运行的多个事物,当这些事物访问数据库中相同的数据时,如果没有必要的采取隔离机制的话,就会导致各种并发问题。看几个名词。第一个脏读读取了脏数据,对于两个事物,T1和T2 t1读取了已经被T2更新但还没有提交的数据。这个数据叫脏读,因为我这个T2怎么了,我T2我是不是还没有确定我要提交呢,那你读这个数据就是无效的。藏族。张读是我们必须要避免的,第二个不可重复读,对于两个事物,T1和T2 t1读了一个字段,然后T2更新了这个字段,再读的话,这个数据不一样了,这是不是很正常?
01:03
是吧,这叫不可重复读,但是开发的时候的话呢,这种情况是可以避免的,我第一次读完,我第一次读是一个结果,我第二次再读,在我第二次读的这个过程中,第二更新了,而且还提交了,那我读的数据它就新了呗,这没什么。还有一个换读,对于两个事物,T1T2 t1中一个表里边读了一个字段T2,然后T2的话呢,呃,插入了一个新的行,我T一再读的时候发现多了几行。这个啊也比较正常,所以说我们应该避免脏堵好了。数据库事物的隔离性,数据库系统必须具有隔离并呃隔离并发运行各个事物的能力,使他们互不影响,避免各种并发问题。就是说我如果要是隔离级别高的话,我可以避免所有的这些并发问题。但很明显。
02:04
隔离级别越高。数据的一致性就。呃,这个一致性越好,但并发性就越弱,就是我正在读,我正在读这个表的时候,这个时候其他的这个事物连操作都不可以,那我仅是一个读,你就不能操作的话,很明显这个时候这个效率太低了。所以说的话呢,我们应该采取合适的隔离级别。既能够保证不出现大的并发问题。也能够保证事物的这个呃,并发性能,不,不出现并发问题,同时你还要保证性能,那么数据库提供了四种类级别,分别是第一个叫read UN committed读未提交的数据,我要是不未提交的话,是不是就容易出现那个脏毒啊?第二个读已提交的数据,读已提交我们觉得很正常。
03:04
还有一个是嗯,可重复读,还有一个串行化,我们看一看,第一个读未提交的,允许事物读取其他事物未提交的数据,这个时候的话呢,会出现张毒,会出现不可重复读,当然也会出现换读,这个是啊,隔离级别最低的,但病发是最高的。并发性能还是最高的,这么说啊,性能是最高的,但是这种情况我们肯定不应该用是吧,用这个的话,我读了一个张数据还是挺可怕的,就是人家只是想更新,但是还没提交呢,你就读到了这个不行。好了,Read commit读已提交的,允许事物读取其他事物已经提交的变更可以避免脏读,但是不可重复度跟换读还会出现。好了,这个是读,呃,可重复读,确保事物可以多次从一个字段中读取相同的值。
04:07
多次读的话呢,我可以读一样的值,这个事物在持续期间禁止其他事物对这个字段进行更新,可以避免脏读跟不可重复读,但是换读依然存在问题是什么呀?问题要是这么做的话呢,这个性能就弱了,我在读的过程中,其他事我不能够对这个字段进行更新,我只是读了一下别人,连别人连动都不能动,这个问题才可怕了。性能上会受影响。Q,一个叫串行化,确保一个事物从一个表读取相同的行,在这个读取过程中,其他事物对该表进行插入、更新、删除都会避免,那么可以避免任何的这个并发问题,但性能十分低下。所以说的话呢,综合这四个看的话,我们认为呃,读已提交是最合适的一个隔离级别,Oracle只支持两隔离级别,一个是读已提交,一个是串行化,默认是读已提交。
05:06
所以说的话呢,这个独已提交是我们现在都普遍使用的隔离级别,还有一个就是my circle啊,支持四种隔离级别,那默认是嗯,可重复读好了。说了这么多的话呢,我们想看看啊,想看看究竟怎么样会发生这样的事。Transaction。好了,这是事物的隔离级别,好,那我们先看吧,我想测试一下事物的隔离级别。
06:01
那我们先操作一下吧。等于。好,然后我写的快。Finally。E。来我们看一下啊,首先呢,我们可以使用什么呀,我们可以使用这个connection去设置各事物的隔离级别,然后在这个呃,GB中B区中。可以通过connection的。找一下set transaction exion来设置隔离级别。
07:05
这个方法来设置事物的隔离级别啊,这可以来设置,那我们看一下吧,怎么设呢?设的时候大家看connection耐本身是不是有些方法呀,有一个是读已提交,还有一个读未提交,还有一个是呃串行化,还有一个是可重复读,就是对应的那四个隔离级别,那后边是什么?后边是不是一些常量啊,大家看一下啊,我这个方法是不是接受一个int型的参数是吧?然后后边的话呢,它给的是我们给给的是一些常量,它为什么没告没给直接1234啊。因为你要是1234的话,你是不是具体记不住哪一个是哪个级别呀,但是我要用一个常量标识的话,就是说我这个值可能是一,这个值可能是二,我要用常量一标识的话,那就清楚了,哎,我一用常量用用这样的方式一引用的话,这个时候我就可以来设置合理的隔离级别,那我们设置一下呢,首先的话呢,我要来读啊,读一个数据,读一个数据do里边我们写过一个方法。
08:19
读某一个数据的这个方法。暂时先复制过来,CTRLC。过来你看一下啊。8FCTRL的F。啊,那我现在的话呢,我这个方法的话,我这是一直读的是吧,这个connection自己的一个connection,然后获取我现在啊在这块我来设置一下connection点。我们找connection点啊,我来读什么呢?我来读未提交的数据,我我设置了啊,我要读取的是未提交的数据,好了,我要读的是一个未提交数据的话,这个事有意思了,Connection我们首先看。
09:20
我把connection搞定哈。Connection。等于。D bc tool connection,然后呢,啊,我设置提交设置不是不是自动提交哈,False。然后我来进行,我来进行一个更新操作,更新操作的话呢,我们也来写。这样的一个吧,CTRLC过来看。写上什么呀,让一减500块钱刷一下变成1000。
10:05
保存好了,但是呢,我这块可以提交connection点在28行加上一个断点,这个时候我代码是28行的时候,我是不会停住啊。我会停住吧,我停住的话呢,然后我用另外一个线程来读,我看一看你这个啊更新但还没提交的数据,我能不能读得到。我们来看这个是这应该是update的啊写的。再来看一个读的。Control c。Read at,这个具体这个过程呢。不用哈,因为这里边儿的话呢,我有connection,我们来看一下。
11:03
我读的是string等于。Select from user ID等于一。好。我取一下。Balance等于get for value口没有好,我先打一下,你看下这个值哈。1000没问题好了,那我注意哈,28行这块的话呢,我停了一下,我停了一下这个用来跑。虽然我这是以前的,以前的我先去掉。
12:05
过。好了,没提交没提交,我再回来我们这个数据。大家看是不是500啊,这个事就很操蛋。我这个数据还没提交呢,我读到了,这就有问题。哎,这就是我们所谓的什么事物的。隔离级别好了,那我把这个停掉。然后的话呢,我来修改一下隔离级别,比方说我给它设为。读这个隔离级别哈,是为什么呢,我读的话呢,我只去读。无,已提交。看点点read。
13:05
Section read,我读你提交的,没提交的呀,我读不着再看。跑一下。Debug。停住看那个钱数还是以前,因为刚才说没提交啊,好了我再回来,注意没提交呢哈,那我这个现在是读已提交,所以说这个值读到的应该是。1000而不是500,看见了吧,怎么样,我是不是设置了这个事物的隔离级别呀,我这个时候我读的是已提交的数据。而不是被提交的啊,这个时候的话呢,我就能够看见这样的效果停下。好了,这就是我们什么?这就是我们的事物的这个隔离级别,我们一般情况下。
14:01
我们在写这个程序代码的时候的话呢,我们都写一个set transaction写什么呀,写一个这个呃,读已提交就可以,那我们看一下,看一下什么呢?我们看一下啊,默认的隔离级别是什么?connection.get section看一看默认这个是什么,默认这个直接跑完就可以了,默认的隔离级别。是减是不是四啊,这个四是啥呢。它是几?那可的是二吧。四往下翻四是什么?默认这个隔离级别是读,这是可重复读吧,这个时候怎么样,这个时候我这个,嗯,我读的是什么,我读的是circle,买circle的默认隔离级别都是它,都是它,所以说的话呢,这个结果会是四。
15:03
而我那我用买色Q的话呢,我用这种隔离级别也还行是吧,它起码不会出现占股的问题,但是呢,有可能在性能上还是会弱一点,那我们怎么办呢?我们除了在程序里边,比方说在程序里边是吧,我写一下我读的是已提交的数据。这儿啊。不是transaction。嗯,我我设置一下是吧,我要读已提交的数据,一方面我通过这样的方式来进行设置,另外一方面呢,我们也可以来修改。MYSQL的这个隔离级别我们看如何来进行修改,在MYSQ中我可以来设置隔离级别,那每启动一个MYSQL程序都可以获得一个单独的数据库链接,每个数据库链接有一个全局的,一个全局的变量啊。at特at TX_isol isol表示当前事物的隔离级别,MY默默认隔离级别是独已提交,如何来查看呢?这样查。
16:12
CTRLCCMD。I circle。杠U-T1230。加上来啊,默认是读已提交啊,可重复读,重复读,那好了,那我可以通过这样的方式来设置隔离级别,其中我们有一有一个是什么呀,叫设置全局的隔离级别,我这样说完之后的话呢,它将对。它将对这个呃整个哎我开了两个呀,关一个,它将对整个这个呃买色这个隔离级别都会发生变化,就是说你下一次开的话,你要是再去看的话,那它已经怎么样,隔离级别已经改了,已经变成这个读已提交了,那level是都提交好,我再开一个,大家再看PMD,然后买S杠,U杠,P1230。
17:23
后来粘贴对C。来看是不是已经变成独已提交了呀,好了,这个是独已提交的话,那我们感兴趣的是,那我占用JDBC去做的时候,这个默认的隔离级别是什么,我们看一下啊,用它去跑,这个时候这个默认级别应该是跟my circleq一致的,是不是变成二了,刚才我们看了吧,二是谁二是不是读已提交啊。
18:03
看这个二已经是这个毒比胶,这就是事物的隔离级别,一方面的话呢,我们可以在应用程序里面通过。的的方式来设置隔离级别,另外一方面我们还可以通过这个MY色扣提供的命令来设置隔离级别,而orac口的呢,不用动orac code的默认隔离级别就是read隔离or入口里边就俩,一个是序列化,一个是呃,读一提交买S里边多一些。我们如果要是觉得。那个读已提交对性能有有影响的话,我们通过这样的一个命令设置一下就可以了,那极个别情况下,我们才在程序里边自动的来来写它。
19:05
当然我们可以写啊,我们可以写,我们后边在这个做这个数据库连接池的时候,它还有单独的参数来说,哎,我连接池里边所有链接采用的这个隔离级别都是什么样的,我们在学harm类的时候,包括spring的候,我们也可以来说,但是最好的方式就是数据库里边的一条命令搞定了,我这块的话呢,我就不用弄,如果我们这个程序需要经常切换数据库的话,而且数据库的隔离级别未知,我还无法去设的话,这个时候写上嗯,这样的这个银行代码就非常有必要。
我来说两句