本文研究的主要是Hibernate的Session_flush与隔离级别,具体介绍和实例如下。
概念介绍
我们先来看一些概念:
<强> 1。脏读:强>脏读又称为无效数据的读出,是指在数据库访问中,事物T1将某一值修改,然后事物T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取的数据是无效的。脏读就是指当一个事物正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事物也访问这个数据,然后使用了这个数据,因为这个数据还是没有提交的数据,那么另外一个事物读到的这个数据就是脏数据,依据脏数据所做的操作是不正确的。
<强> 2。不可重复读:>强比如我在读一个帖子,我查出来的数据是张三,李四,然后我一刷新发现最开始的张三变成了张八,这就是所谓的不可重复读,因为我读出的数据没重复了嘛。
<强> 3。幻读:强>我在查数据的时候,开始查出来的记录为3条,我一刷,新发现记录变为了8条,这就是幻读。
<强> 4。提交读:>强提交了之后才可以读取,甲骨文默认就是这个,这种方式是不存在脏读的。
<强> 5。可重复度:强>很显然是和不可重复读相反的,它可以避免不可重复读,但是这个不能避免幻读。
<强> 6。序列化:强>这种方式非常严格,通俗的说就是,当我在做一件事情的时候,其他任何人都不能做,非常安全,但是效率极低。
隔离级别
<强>下面我们通过实际的例子来体会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与隔离级别代码详解