JavaEE——事务隔离和锁
Posted 凯哥学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaEE——事务隔离和锁相关的知识,希望对你有一定的参考价值。
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
事务隔离
事务隔离级别有5个:
读取未提交数据,读取提交数据,可重读,可串行化
隔离性:
读取未提交数据:在双方事务都未结束前,能够读取(看到)到对方未真正写下去的数据。
提交数据数据:在双方事务未结束前,不能看到对方在事务内做了什么。当对方提交后,在本事务内就可以读取到那边提交的数据。
可重读:在双方事务未结束前,不管对方是否未提交,在本事务内读取的都保持一致
串行化:锁表操作,我操作,别人都不用操作了
读取未提交数据坏处:略过的这条数据,可能对方回滚了,但我略过了。脏读。
读取提交数据坏处:双方都未提交,看不到对方在干嘛,有一方必然修改失败,明明是有的可以操作的。前后读取不一致,又叫不可重复读取。
这两个隔离级别,都可以由多个事务操作一条数据。不过是在事务中读数据产生了不同区别
可重读坏处:双方都未提交,对方提交了,自己也不知道。当自己也结束了才能看到。保证数据的完整,但是对方都操作了,自己都不知道。幻读。
可重读隔离级别,当自己对记录操作时,就不允许别人在操作记录了。
串行化坏处:锁表占资源,别人也不能操作
应对不同的情况,可能会更改隔离线。比如售票。查到票了,这个票就需要占住了,不管是否买,查到了就是要用的。就需要不可重读隔离级别
锁
锁:排他锁,当自己操作dml的,不允许别人在进行dml操作
查询加锁,排他锁,将查询的数据查出来并加锁,此时不允许别人进行dml操作
查询加锁,共享锁,可以相互加锁,不过我的操作是建立在别人松开锁的前提下,逐层外剥
当结束事务时,锁就结束了,在我们操作dml语句时,排他锁就自动加上了,测试:
获得连接对象,update修改并执行。死循环,线程不结束。在运行同样的程序,查看效果:
第一次进行,row已经为1,表示已经修改了,只是事务没有任何操作
开启程序,这边不进行任何操作
因为记录被锁住了,自己在等,这就是排他锁。在事务范围内(自动,手动)操作dml语句自动加锁,期间不允许其他操作。
锁的结束需要事务结束才可以。当我结束掉对方时,这边立刻就可以操作了。锁是在事务范围内,当我们以前dml时也会加锁,事务那时是自动的,在单条SQL存在事务也就存在锁。
锁是活在事务内的,结束事务就结束了锁。
死锁,两个事务开着,你这个事务操作一条数据,我在对这条数据操作。这是排他。我操作一条数据,你操作一条数据,我们在双方又交叉操作对方数据。你等我我等你,就是死锁了。双方的锁互相加上,谁来解锁?mysql数据库会自动掐死一方结束死锁。
在程序中什么是死锁,两个类,两个方法都有同步,我们都自己调一下方法,自己都获得锁。双方在互调一下方法,就产生死锁了。
以上是关于JavaEE——事务隔离和锁的主要内容,如果未能解决你的问题,请参考以下文章