Hibernate的Session_flush与隔离级别代码详解

  

本文研究的主要是Hibernate的Session_flush与隔离级别,具体介绍和实例如下。

  

概念介绍

  

我们先来看一些概念:
  

  

<强> 1。脏读:脏读又称为无效数据的读出,是指在数据库访问中,事物T1将某一值修改,然后事物T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取的数据是无效的。脏读就是指当一个事物正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事物也访问这个数据,然后使用了这个数据,因为这个数据还是没有提交的数据,那么另外一个事物读到的这个数据就是脏数据,依据脏数据所做的操作是不正确的。
  

  

<强> 2。不可重复读:强比如我在读一个帖子,我查出来的数据是张三,李四,然后我一刷新发现最开始的张三变成了张八,这就是所谓的不可重复读,因为我读出的数据没重复了嘛。
  

  

<强> 3。幻读:我在查数据的时候,开始查出来的记录为3条,我一刷,新发现记录变为了8条,这就是幻读。
  

  

<强> 4。提交读:强提交了之后才可以读取,甲骨文默认就是这个,这种方式是不存在脏读的。
  

  

<强> 5。可重复度:很显然是和不可重复读相反的,它可以避免不可重复读,但是这个不能避免幻读。
  

  

<强> 6。序列化:这种方式非常严格,通俗的说就是,当我在做一件事情的时候,其他任何人都不能做,非常安全,但是效率极低。

  

隔离级别

  

 Hibernate的Session_flush与隔离级别代码详解

  

<强>下面我们通过实际的例子来体会Hibernate清除缓存的应用。

  

<强> Hibernate映射数据库和主键的生成策略有关。
  

  

案例一

  

UUID的方式生成主键的例子:

        公开课用户{   私人字符串uid;   私人字符串uname;   私人生日日期;   公共字符串getUid () {   返回uid;   }   公共空间setUid(字符串uid) {   这一点。uid=uid;   }   公共字符串getUname () {   返回uname;   }   公共空间setUname(字符串uname) {   这一点。uname=uname;   }   上市日期getBirthday () {   返回的生日;   }   公共空间setBirthday(日期的生日){   这一点。生日=生日;   }   }      

<强> User.hbm.xml:

        & lt; & # 63; xml version=" 1.0 " & # 63;比;   & lt; !DOCTYPE hibernate映射公共   ”——//Hibernate/Hibernate映射3.0 DTD//EN "   “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”在   & lt; !——包表示实体类的包名——比;   & lt; hibernate映射包=癱om.lixue.bean”比;   & lt; !——类结点的名字表示实体的类名,表表示实体映射到数据库表的中名称——比;   & lt;类名称==皌_user”比“用户”表;   & lt; id名称=皍id”比;   & lt; !——通过UUID的方式生成——比;   & lt;发电机类=" uuid "/比;   & lt;/id>   & lt;属性名=" uname”/比;   & lt;属性名=吧铡?比;   & lt;/class>   & lt;/hibernate-mapping>之前      

<强>测试方法:

     /* *   *测试uuid主键生成策略   */公共空间testSave1 () {/*定义的会话和事物*/会议会话=零;   交易事务=零;      尝试{/*获取会话和事物*/会话=HibernateUtils.getSession ();   事务=session.beginTransaction ();/*创建用户*/用户用户=新用户();   user.setUname(“习近平”);   用户。setBirthday(新日期());/* *   *因为用户的主键生成策略为uuid,所以调用完保存之后,只是将用户纳入到会话管理   *不会发出插入语句,但是ID已经生成,PersistenceContext中的existsInDatebase状态为假   */session.save(用户);/* *   *调用冲洗,Hibernate会清理缓存(将会话→插入中临时集合中的对象插入数据库,在清空临时集合)   *此时并不能在数据库中看到数据,但是如果数据库的隔离级别设置为未提交读,   *那么我们可以看到冲洗过的数据,并且PersistenceContext中existsInDatabase状态为真实的   */session.flush ();/* *   *提交事物   *默认情况下,提交操作会执行冲清理缓存,   *所以不用显示的调用冲洗   *提交后数据是无法回滚的   */transaction.commit ();   }捕捉(异常e) {   e.printStackTrace ();   transaction.rollback ();   最后}{   HibernateUtils.closeSession(会话);   }   }

Hibernate的Session_flush与隔离级别代码详解