Hibernate的事务处理

事务:事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!!

事务特性
  原子性:事务一组操作不可分割.
  一致性:事务的执行前后,数据完整性要保持一致.
  隔离性:一个事务在执行的过程中不应该受到其他事务的干扰.
  持久性:一旦事务结束,数据就永久保存数据库.

如果不考虑事务的隔离性引发一些安全性问题:
  5大类问题:3类读问题 2类写问题.
    读问题:
      脏读 :一个事务读到另一个事务未提交数据.
      不可重复读 :一个事务读到另一个事务已经提交数据(update),导致查询结果不一致.
      虚读 :一个事务读到另一个事务已经提交的数据(insert),导致查询结果不一致

    避免三种读的问题(设置事务的隔离级别):
        未提交读:以上三种读问题 都有可能发生.
        已提交读:避免脏读,但是不可重复读和虚读有可能发生.
        重复读:避免脏读和不可重复读,但是虚读是有可能发生.
        串行的:可以避免以上三种读问题.

在Hibernate中设置事务的隔离级别
  在核心配置文件中

<!--
  1—Read uncommitted isolation
  2—Read committed isolation
  4—Repeatable read isolation
  8—Serializable isolation
-->
<property name="hibernate.connection.isolation">4</property>

写问题:丢失更新
  解决
    悲观锁:依赖于数据库机制,锁住当前数据,其它任何用户都不能读取或修改

@Test
/*
* 使用悲观锁解决丢失更新
*/
public void demo4(){
  Session session = HibernateUtils.openSession();
  Transaction tx = session.beginTransaction();
  // 使用悲观锁(排他锁),LockMode.UPGRADE:利用数据库的for update字句加锁
  Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
  customer.setAge(32);
  tx.commit();
  session.close();
}

    乐观锁:不作数据库层次上的锁定,为了维护正确的数据,乐观锁采用应用程序上的逻辑实现版本控制的方法(在数据库中加入一个VERSON栏记录,在读取数 据时连同版本号一同读取,并在更新数据时递增版本号,然后比对版本号与数据库中的版本号,如果大于数据库中的版本号则予以更新,否则就回报错误)

public class Customer {
  private Integer cid;
  private String cname;
  private Integer version;

  public Integer getVersion() {
    return version;
  }
  public void setVersion(Integer version) {
    this.version = version;
  }
  public Integer getCid() {
    return cid;
  }
  public void setCid(Integer cid) {
    this.cid = cid;
  }
  public String getCname() {
    return cname;
  }
  public void setCname(String cname) {
    this.cname = cname;
  }
}
<hibernate-mapping >
  <class name="cn.yzu.vo.Customer" batch-size="2" table="customer" lazy="true">
    <id name="cid" column="cid">
      <generator class="native"/>
    </id>
    <version name="version"/>
    <property name="cname" column="cname" length="30"/>
  </class>
</hibernate-mapping>

线程绑定的session
  在Hibernate.cfg.xml中配置一个:<property name="hibernate.current_session_context_class">thread</property>
    使用SessionFactory中的getCurrentSession()方法
    底层就是ThreadLocal

  当前线程中的session不需要进行关闭,线程结束后自动关闭!!!

时间: 2024-10-28 11:45:27

Hibernate的事务处理的相关文章

分析Hibernate的事务处理机制

Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的 Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析: Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置: #hibernate.transaction.factory_cl

hibernate之事务处理

四个方面:事务的性质,事物的隔离级别,hibernate配置事务的隔离级别,使用事务小案例 1. 事务的性质: 四种性质:原子性,一致性,隔离性,持久性. 原子性:原子,不可再分.一个操作不能分为更小的操作.要不全部执行,要不全不执行. 一致性:事务在完成时,必须使得所有的数据保持一致的状态.(ps:数据状态重点,与开始事务前一样的状态) 隔离性(并发才考虑):事务查看数据时数据所处在的状态,要么是另一个并发事务修改它之前的状态,要么是另一个并发事务修改它之后的状态,事务不会查看中间状态的数据

【Hibernate】事务处理

一.概述 一.概述 事务 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性 原子性:事务一组操作不可分割. 一致性:事务的执行前后,数据完整性要保持一致. 隔离性:一个事务在执行的过程中不应该受到其他事务的干扰. 持久性:一旦事务结束,数据就永久保存数据库. 如果不考虑事务的隔离性引发一些安全性问题: 5大类问题:3类读问题 2类写问题. 读问题: 脏读: 一个事务读到另一个事务未提交数据. 不可重复读: 一个事务读到另一个事务已经提交数据(update),导致查询结果不一致

为什么hibernate需要事务?

Hibernate是对JDBC的轻量级对象封装, Hibernate本身是不具备事务处理功能的,Hibernate事务实际上是底层的JDBC事务的封装,或者是JTA事务的封装. Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate中, Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写 commit也没有关系,由于Hibernate

Struts+spring+Hibernate 制作一个简单的登录验证

index.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"

Hibernate 3 深度解析--苏春波

Hibernate 3 深度解析 Hibernate 作为 Java ORM 模式的优秀开源实现, 当下已经成为一种标准,为饱受 JDBC 折磨的 Java 开发者带来了“福音.快速的版本更新,想开发者所想,Hibernate 的开发团队俨然就是我们开发者的知音呀.随着 Hibernate 的用户群的越来越壮大,Hibernate 的功能也变得更加强大和健硕起来,下面就对于我们比较常用和关心的一些内容做一些比较深入的探讨,我们的宗旨就是不但会灵活应用,还能知其所以然,不要求大家一定要把 Hibe

hibernate批量更新和删除数据

批量处理  不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过,听说是这样.我记得以前在做大批量数据转移的时候我们测试过Hibernate,很慢,直接Pass,当时我们的系统由于用多个数据库,所以用的jdbc,如果不考虑移植还是可以用存储过程的. 存储过程对数据库依赖过强,不便系统移植   浅析Hibernate下数据批量处理方法 关键字: hibernate指处理

Hibernate的理论知识点

转自网络 一. 对象持久化的理论 1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复. 2.对象持久化的原因(目标): 物理: 1) 内存不能持久,需要在硬盘上持久保存 //(物理上,物理的都不是根本原因) 2) 内存容量有限,需要在容量更大的硬盘上保存 应用: 3) 共享(Internet的本质:信息的收集.整理.发布) //最重要的原因 4) 检索(大规模) //也很重要 5) 管理(备份.安全) 3.怎样进行对象持久化?(仅从JAVA方面讲) 物理: 1) 对象序列化

Hibernate下的增删改查

概述: 关系--对象映射的中间件,属于开源ORM框架,是我们业务逻辑层中的调用数据库的中间件 演变: jdbc---hibernater---mybatis hibernate和mybatis区别? 1:hiberanter学习的难度要比mybatis要大,复杂度要高 2:hibernate不需要写sql语句,自动生成,而mybatis需要写sql语句进行数据操作 3:hibernate支持分页(API),而mybatis不支持分页(那是属于插件) 4:hibernate支持事务处理,而myba