Hibernate悲观锁乐观锁

1,Hibernate中有一种特殊的属性:版本(Version)属性。版本属性不参与业务逻辑,只用来保证不会有两个线程同时对该数据进行写操作。版本属性是乐观锁的一种实现方式。乐观锁是相对于悲观锁而言的。

悲观锁与乐观锁都是保证数据准确性的机制。

悲观锁:为保证数据的准确性,程序必须保证在一个线程修改数据的时候,该数据没有被其他线程修改。在传统的数据库标称中,程序修改数据时先说定该数据行,使其他程序无法修改该行数据,修改完毕后释放数据锁,以此保证数据准确性。由于该机制需要锁定数据行,被锁定的数据只能被一个线程使用,因此被称为悲观锁。

乐观锁:乐观锁通过Version列保存当前数据的版本,如果程序修改了数据就将版本加1。反过来,如果版本列有了变化,说明数据被修改过了。

程序保存数据时会检查数据的Version列。如果Version列已经发生了改变,程序会重新读取,并修改保存数据。由于该机制不需要锁定数据行,允许多条线程同时访问同一条数据,因此被称为乐观锁,乐观锁效率高于悲观锁。

XML配置乐观锁

XML中使用<version/>配置乐观锁,name属性配置版本列。<version/>版本列要配置在<id/>主键后面,<property/>普通属性前面。

<Version name="version"></version>

 

 

在现代Web编程中,开发者已经不需要管住悲观锁、乐观锁的实现细节,只需要配置一下即可,框架底层会自动实现。

版本属性既可以为int,long等数据类型,也可以为Timestamp时间戳类型,配置时用type配置类型

<version type="timestamp" colum="version">

或者直接用<timestemp/>配置日期版本,与上面的配置时等价的

<timestamp column="version">

延迟加载与及时加载

从控制

Hibernate悲观锁乐观锁

上一篇:man命令


下一篇:AtCoder Grand Contest 009