当前位置:
首页> Hibernate的LockMode悲观锁和乐观锁
Hibernate的LockMode悲观锁和乐观锁
时间:2017-10-30 下载该word文档
在了解Hibernate的LockMode之前,我们先讲一下LockMode是什么东西?其实LockMode只是在使用Hibernate 中 的session.load(加载数据时指定的模式,也叫悲观锁(模式),然而,悲观锁是为了弥补read-committed 机制的不足,从而解决non-repeatable (不可重复读)和 phantom-read (幻读)问题 ,而non-repeatable 和 phantom-read 这两个问题也只是事务并发是产生的两种问题...
看了我写的这一段后,我相信很多读者会有点懵,这就对了,看完下面的文章,再后过头来读这一段,就全都明白了。
我们知道,事务由那几个特性,四个(ACID):
1.原子性(Atomicity):
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2.一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3.隔离性(Isolation)
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
4.持久性(Durability)
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。
一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
在处理事务过程中,事务并发是不可避免的,从而会出现以下几个问题: 1.丢失更新(Lost Update)(第一类和第二类)
2.脏读(Dirty Read)
3.不可重复读(Non-repeatable Read) 4.幻读(Phantom Read)
针对并发事务出现的问题,Hibernate 采用了数据库的事务隔离机制(详细文档见Herbernate 参考文档的 java.sql.Connection ),一般有以下四种处理机制:
1.read-uncommitted 2.read-committed 3.repeatable read 4.serializable
四种机制的具体价值:
A. 只要数据库支持事务,就不可能出现第一类丢失更新
B. read-uncommitted(允许读取未提交的数据)会出现dirty read , phantom-read,non-repeatable read 问题
C. read-committed(读取已提交的数据 ,项目中一般使用这个,MySql 数据库默认是这种机制)不会出现dirty read ,因为只有另一个事务提交才会读出来结果,但仍然会出现non-repeatable和phantom-read(所以使用read-committed 机制可用悲观锁和乐观锁来解决non-repeatable 和 phantom-read 问题)
在hibernate中的事务隔离级别的设定(使用
hibernate.connection.isolation配置,取之1,2,4,8)
1.hibernate.connection.isolation = 2 (如果不设置,默认依赖数据库本身的级别,例如MySql为2,read-committed)
2.使用悲观锁