1.事务

并发控制:

并发控制是确保及时纠正由并发操作导致的错误的一种机制,并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。

并发机制不正确可能导致脏读、幻读、不可重复读和更新丢失等此类问题。

1)脏读(Dirty read)

如果第二个事务读取了第一个事务修改的但是还没有提交的数据,结果第一个事务最后发生回滚,数据更新没有被保存到数据库中,那么第二个事务读到的数据就是不正确的,是被第一个事务弄脏的数据,所以这种现象叫脏读。

 2)不可重复读(Unrepeatable read)

两个事务都读取同一行数据,一个事务修改数据并提交,另一个事务也修改数据并提交(不可重复读重点在于update和delete)。

 3) 幻读(Phantom read)

一个事务执行两次查询,结果发现第二次查询的结果比第一次查询的结果数据多了,这可能是因为另一个事务在两次查询之间插入了新行,这就是所谓的“幻读”问题。(幻读的重点在于insert。)

 4) 更新丢失(Lost Update)

两个事务都更新同一行数据,如果一个事务执行失败,导致事务回滚,会把另一个事务的更新结果也丢失。

2.锁模型:

a)  悲观锁

          悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

 

         b)  乐观锁(大多数情况下都使用)

         乐观锁hibernate的实现:

         乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

Hbernate事务与锁模型

      1. 实体中添加整形version,配置问题配置version标签,注意verison标签必须放到id后边,所有property的前面:

Hbernate事务与锁模型

      2. 实体中添加时间戳,hbm文件配置中配置timestamp标签,该标签也是只能放到id的后边,所有property的前面。

      3.对于一个实体来说,version和timestamp不能共存。

      悲观锁在hibernate中需要在查询的时候指定,悲观锁的意思是:当有一个线程在进行查询的时候会锁定整个查询结果,其他线程无法查询这些结果,但是可以插入,可能会存在“幻读”的现象

转载于:https://my.oschina.net/wii01/blog/983759

相关文章: