JavaEE——事务隔离和锁

Posted 凯哥学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaEE——事务隔离和锁相关的知识,希望对你有一定的参考价值。


声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

事务隔离

事务隔离级别有5个:
读取未提交数据,读取提交数据,可重读,可串行化

隔离性:

读取未提交数据:在双方事务都未结束前,能够读取(看到)到对方未真正写下去的数据。

提交数据数据:在双方事务未结束前,不能看到对方在事务内做了什么。当对方提交后,在本事务内就可以读取到那边提交的数据。

可重读:在双方事务未结束前,不管对方是否未提交,在本事务内读取的都保持一致

串行化:锁表操作,我操作,别人都不用操作了

读取未提交数据坏处:略过的这条数据,可能对方回滚了,但我略过了。脏读。

读取提交数据坏处:双方都未提交,看不到对方在干嘛,有一方必然修改失败,明明是有的可以操作的。前后读取不一致,又叫不可重复读取。

这两个隔离级别,都可以由多个事务操作一条数据。不过是在事务中读数据产生了不同区别

可重读坏处:双方都未提交,对方提交了,自己也不知道。当自己也结束了才能看到。保证数据的完整,但是对方都操作了,自己都不知道。幻读。

可重读隔离级别,当自己对记录操作时,就不允许别人在操作记录了。

串行化坏处:锁表占资源,别人也不能操作

应对不同的情况,可能会更改隔离线。比如售票。查到票了,这个票就需要占住了,不管是否买,查到了就是要用的。就需要不可重读隔离级别

锁:排他锁,当自己操作dml的,不允许别人在进行dml操作
查询加锁,排他锁,将查询的数据查出来并加锁,此时不允许别人进行dml操作
查询加锁,共享锁,可以相互加锁,不过我的操作是建立在别人松开锁的前提下,逐层外剥

当结束事务时,锁就结束了,在我们操作dml语句时,排他锁就自动加上了,测试:

JavaEE——事务隔离和锁

获得连接对象,update修改并执行。死循环,线程不结束。在运行同样的程序,查看效果:

第一次进行,row已经为1,表示已经修改了,只是事务没有任何操作

JavaEE——事务隔离和锁

开启程序,这边不进行任何操作

因为记录被锁住了,自己在等,这就是排他锁。在事务范围内(自动,手动)操作dml语句自动加锁,期间不允许其他操作。

锁的结束需要事务结束才可以。当我结束掉对方时,这边立刻就可以操作了。锁是在事务范围内,当我们以前dml时也会加锁,事务那时是自动的,在单条SQL存在事务也就存在锁。

锁是活在事务内的,结束事务就结束了锁。

死锁,两个事务开着,你这个事务操作一条数据,我在对这条数据操作。这是排他。我操作一条数据,你操作一条数据,我们在双方又交叉操作对方数据。你等我我等你,就是死锁了。双方的锁互相加上,谁来解锁?mysql数据库会自动掐死一方结束死锁。

在程序中什么是死锁,两个类,两个方法都有同步,我们都自己调一下方法,自己都获得锁。双方在互调一下方法,就产生死锁了。


以上是关于JavaEE——事务隔离和锁的主要内容,如果未能解决你的问题,请参考以下文章

mysql的事务,隔离级别和锁

Innodb中的事务隔离级别和锁的关系

Innodb中的事务隔离级别和锁的关系

Mysql数据库事务的隔离级别和锁的实现原理分析

数据库事务中的隔离级别和锁+spring Transactional注解

深入了解MySQL的隔离级别和锁机制