zoukankan      html  css  js  c++  java
  • 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不需要进行关闭,线程结束后自动关闭!!!

  • 相关阅读:
    DEV GridControl打印 导出
    DES加密解密类
    多例模式,保证实例的唯一性,仅适用于form窗体
    c# 计算星座
    官方Radare2书之简介
    linux & windows手机 (长期更新)
    非kali官方源中的那些优秀软件们 --- java反编译反汇编器引擎汇总(长期更新)
    常见的那些模糊不清的计算机相关概念(长期更新)
    什么是网站追踪?它为什么要追踪我?
    浅谈生活中常见的三大应用程序架构(PE、ELF、Mach-O)、五大操作系统(windows、linux、macos、android、ios)和三大cpu架构(x86、arm、mips)
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6194414.html
Copyright © 2011-2022 走看看