hibernate隔离级别出现的原因
隔离级别出现的原因,是防止事务并发操作数据出现异常。
事务并发出现数据异常,这些异常都会在持久层出现。只是各个框架处理的方式不同
下面就说一下hibernate持久层框架的出现的数据异常。
更新丢失:eg事务A用银行账号,取了一部分钱(没提交),于此同时事务B向同一账号存入了一部分钱,并成功提交。现在A提交事务不成功,回滚了。这个时候账号的钱,就是账号最初钱的数目,B事务存入的钱就不见了。
隔离级别(ReadUnCommitted):读取未提交的插入,和更新的数据这样的话就防止了更新丢失
带着这个条件在去想上面那种情况,A在回滚的时候,A知道了B事务存入了钱,在回滚的话,钱的数目就会是原始数目+存入的数目
脏读:事务之间可以相互得到未提交同一数据,这其实是个很可怕的事情,这个是真正值得注意的问题,eg:事务A向账号中存入一部分钱,还没提交。同时B也在向同一账号存钱,不过提交之后会滚了。而现在A可以读到未提交事务的钱的数目,A提交成功
现在钱的数目=最初原始数目+A存入+B存入(B没成功,这样也能行的话,银行亏大发了,那我们这些小百姓,就乐了)
怎么去解决???
读已提交的数据(ReadCommitted):事务之间只能读已经成功更新,插入的数据。这样就避免了。
不可重复读:事务两次查询的结果不同eg:事务A查询了一次账号,现在自己电话来了,就在ATM机前打电话。这个时候事务B往同一账号存入了钱,并成功提交。A电话打完了,再一查(我的个天)钱生崽了。钱增多了。这个时候A就有的犯晕,这个是怎么回事。
可重复读(RepeatableRead):事务职能相互读成功提交,而不能读以成功提交的数据
虚读(幻读):带条件的一些查询,两次查询出现复合条件的数据数目变化不一样。
出现的原因,在两次查询之间,其他的事务成功插入了数据。注意“可重复读:不能读成功更新的数据,但可以读成功插入的数据”。
串行化(Serializable):这个是最安全的级别:为什么。在高并发的情况下,一次只能容许一个事务对相应的数据进行操作。对数据进行相应的锁定
想一下,一次一个事务,虚读这种情况自然就不存在。
没有什么事情是绝对的好,你换来了数据的安全,但数据操作效率就是最慢的,应用不同的级别,看你的场合而定。找寻一种折中最适合的方法。
默认的隔离级别:跟数据库有关(本人认为一般来说读已提交数据的隔离级别数据安全已经不错了。性能也可以)
hibernate只是显示的提供了设置隔离级别
<propertyname=”hibernate.connection.isolation”>4</property>//可填1,2,4(可重复读),8
总结:
隔离级别更行丢失脏读不可重复读虚读
ReadUnCommitted------ynnn
ReadCommitted---------nynn
RepeatableRead--------nyyn
Serializable-----------yyyy
事务的处理应满足ACID原则
原子性(Atomic):事务是一个操作单元,要吗一起成功,要吗一起回滚
一致性(Consistent):事务不能破换数据库的完整性和业务逻辑的一致性。成功与否,你不能破换数据的完整性。eg:一个事务不成功,破换了其他的数据,那就乱套了
隔离性(Isolated):事务并发操作同一数据,事务之间有自己的数据空间。一个事务不会看到其他事务修改的一半的数据,能看到的是,提交之前,或好后的数据,只是为了保证数据的正确性。
持久性(Durable):一但固化到数据库,系统是重启或是什么,数据还在。一直可以使用
欢迎大家指正