锁机制:是数据库为了保证数据的一致性<一个事务的各种操作不相互影响>而使各种共享资源在被并发访问访问变得有序所设计的一种规则,用来保证在当前用户进行操作数据的时候其他的用户不能对同一数据进行任何操作。

  Hibernate是一个持久层框架,他的操作就是用来存取数据库中的数据,为了保证数据的一致性,hibernate提供了自己的锁机制。

  Hibernate的锁机制:

        乐观锁:<pessimistic locking>他认为一般不会出现多个用户同时操作同一条数据的情况,因此不做资料库层次上的锁定,只做应用层的逻辑实现解决。

        悲观锁:<optimistic  locking>做最坏的打算,即他认为每次操作数据的时候总会有其他用户来操作相同的数据,因此必须对整个资料进行锁定,以保证每一次操作的正确性,直到完成操作后解除锁定。

```Hibernate在不使用悲观锁的情况下出现数据不一致的解决方案:

        1:先更新为主

        2:后更新为主

        3:检查发生变动的资料,或是检查所有属性来实现乐观锁。

  Hibernate中推行的乐观锁的实现方式:<通过版本号实现后更新为主>

       1.一张数据库表,跟以往不同的是这张表里多了一个属性version(版本号) 

 CREATE TABLE user (
id INT() NOT NULL auto_increment PRIMARY KEY,
version INT,-- 版本号属性
name VARCHAR() NOT NULL default '',
age INT
);

       2构建实体类,同样的多了一个属性version(版本号)

public class User {
private Integer id;
private Integer version; // 增加版本屬性
private String name;
private Integer age; public User() { }
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

        3 配置文件的构建

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user" optimistic-lock="version"><!--加乐观锁 -->
<id name="id">
<generator class="native"/>
</id>
<version name="version"/>
<property name="name"/>
<property name="age"/>
  </class>
</hibernate-mapping>

    version版本号必须在Id后面映射。

   每次更新数据的时候都会更新版本号,若出现同时获取两个相同对象,第一个对象更新后,版本号发生改变。第二个对象再进行更新时发现版本号错误,此时就会抛出异常更新失败。可以捕获异常对这个对象做有效的处理。

    乐观锁定的弊端:根据版本号来实现锁定,而不是用数据库的锁机制,容易本人越过版本号<比如说强制手动修改数据版本号>操作数据,导致整个锁机制失效。

  Hibernate中悲观锁的实现:<透过系统和资料库本身的功能来实现>

    通过Query或者criteria的setlockMode()实现要锁定的表或列及其锁定模式     

    • LockMode.UPGRADE:利用資料庫的for update子句進行鎖定。
    • LockMode.UPGRADE_NOWAIT:使用for update nowait子句進行鎖定,在Oracle資料庫中使用。

    Session session = sessionFactory.openSession();

    Query query  =  session.creatQuery("from User u");

    query.setLockMode("u",LockMode.UPGRADE);//设定锁模式

    以下三种锁定模式Hibernate会在内部自动加锁,与资料库无关

    • LockMode.WRITE:在insert或update时进行锁定,Hibernate会在save()方法时自动锁定。
    • LockMode.READ:在读取记录Hibernate会自动获得锁定。
    • LockMode.NONE:无锁定。

  悲观锁的弊端:在网络中多用户的并发访问时,资料库的锁定必定会导致用户长时间的等待,大大降低数据的访问速度,和用户体验。

Hibernate中的锁机制的更多相关文章

  1. Atitit.软件与编程语言中的锁机制原理attilax总结

    Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...

  2. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  3. SQL:(转)数据库中的锁机制(数据库中有哪些锁)

    数据库中的锁机制 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数 据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统 ...

  4. Hibernate 中的锁( locking )

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数 ...

  5. 【Hibernate步步为营】--锁机制具体解释

    上篇文章具体讨论了hql的各种查询方法.在讨论过程中写了代码演示样例.hql的查询方法类似于sql,查询的方法比較简单,有sql基础的开发者在使用hql时就会变得相当的简单. Hibernate在操作 ...

  6. hibernate中的缓存机制

    一.为什么要用Hibernate缓存? Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数 ...

  7. Python并发编程之谈谈线程中的“锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...

  8. 内核中的锁机制--RCU

    一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了 ...

  9. Mysql中的锁机制

    原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如 ...

随机推荐

  1. Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

    Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...

  2. 10个最好用的HTML/CSS 工具、插件和资料库

    大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...

  3. ExtJS 4.2 业务开发(二)数据展示和查询

    本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统 ...

  4. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)

    原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...

  6. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  7. css text-fill-color与text-stroke讲解

    顾名思义"text-fill-color"就是文字填充颜色而"text-stroke"就是文字描边.还别说,两个属性可以制作出各种炫酷的文字效果,不过IE系列都 ...

  8. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:

  9. angular中使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  10. ASP.NET 5 Beta 7 版本

    在 VS2015 发布的同时,微软也发布了 ASP.NET 5 的路线图(详见ASP.NET 5 Schedule and Roadmap : https://github.com/aspnet/ho ...