`
yxwang0615
  • 浏览: 559805 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

session.flush() 数据库的隔离级别

阅读更多

session flush 测试:

 

session flush 主要做了两件事:

1.清理缓存;

2.执行sql;

 

session在什么情况下执行flush

1.默认在事务提交时;

2.显示的调用flush;

3.在执行查询前,如:iterate 迭代器

 

插入一条语句,

测试uuid主键生成策略:

 

uuid的主键生成策略,是hibernate提供的,调用了save方法后,虽然不会发出sql语句,session中exitsInDatabase状态为false,执行了session.flush后,如果此时数据库的隔离级别设置为提角度,那么我们可以看到flush过的数据,并且session中exitsInDatabase的状态为true。

提交事务,默认情况下commit操作会先执行flush清理缓存,所以不用显式的调用flush,commit后数据无法回滚。

 

插入一条语句,

测试native主键生成策略:

 

user的主键生成策略为native,所以调用session.save后,将执行insert语句 ,采用native的主键生成策略,id号是数据库生成的,所以save后,为保证有id生成所以该条数据已经保存到了数据库中,数据的状态已经是persistence,纳入了session的管理,如果数据库的隔离级别是未提交读,那么我们可以看见save的数据。

这里不用手动falsh就能看见save后的数据的主要原因还是uuid主键是hibernate生成的,而native主键策略是数据库负责的。

 

 

锁:具有排它性。

 

悲观锁(pessimitic lock):通常依赖于数据库机制,在整个过程中将数据锁定,其他任何数据都不能读取或者修改。

使用的时候,eg:session.load(entityName, id, lockMode);

乐观锁:其实不是锁,是一种冲突解决手段,并发性好。

 

乐观锁数在据库中的表都设置一个版本号,在数据库中设置一个version字段,该字段不许要我们维护,交给hibernate。假设用户A,B都在同一时间取了相同的数据(版本号一样),A修改了数据后,版本号就+1,存回了数据库,B在A提交之后,也把自己修改的想提交给数据库,这时候数据库比较版本号,发现B的版本号比较低,就存不进去,旧数据(版本号 <= 新数据)是不能更新新数据的,出现了更新丢失(lost update)的问题。hibernate会报出提交的是条脏数据的错误。

有的乐观锁实现方式是用了时间戳,根据时间判断版本新旧,但不如比较版本号用的多。

 

数据库中加入version字段,在实体类中加入private int version属性,在该实体的映射文件的class标签下用

optimistic-lock="version" ,表明该实体是受乐观锁根据版本号version控制,并在class表现下加入<property

name = "version"/>

 

数据库的隔离级别:

 

未提交读:数据没有提交就能在数据库中读到数据(基本没有数据库采用)。

已提交读:数据提交后才能在数据库中读到(oracle默认)。

可重复读:同一查询在同一事务中多次进行,其他提交事务不能对该事物操作的对象修改或删除,相当于悲观锁,所以不管对该事务读取多少次,都是一样的结果(mysql默认)。
 

 

在事务提交之时候,session·.flush()会被首先执行,hibernate用它清理缓存,执行sql。

什么时候需要对hibernate的session进行flush和clear

 http://www.iteye.com/wiki/topic/838089

分享到:
评论

相关推荐

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    需要注意的是,`refresh()`方法在事务的隔离级别为Read Committed(读已提交)时才能保证效果,这是因为在其他隔离级别下,可能无法看到其他事务已经提交的更改。 在使用这些方法时,必须谨慎考虑事务管理和缓存...

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

    Hibernate的Session_flush与隔离级别代码详解 Hibernate 是一个基于Java的 ORM(Object-Relational Mapping)工具,提供了将 Java 对象映射到关系数据库的能力。其中 Session_flush 和隔离级别是两个重要的概念。 ...

    hibernate_flush 深入了解

    本文将深入探讨Hibernate的Flush过程,以及它如何与数据库事务和隔离级别相互作用。 首先,我们需要明确什么是Hibernate的Flush操作。Flush是Hibernate将内存中的对象状态同步到数据库的过程。当Session中的对象被...

    hibernate5--2.数据持久化及事务

    - 使用`Session.flush()`显式触发脏检查,如果发现异常,事务也会回滚。 通过以上内容,我们了解了Hibernate 5在数据持久化和事务管理方面的基本操作和注意事项。在实际项目中,结合事务的隔离级别、锁机制以及适当...

    hibernate更新操作

    `session.flush()`将内存中的更改同步到数据库。这样做的好处是可以在一次Session中管理多个操作,提高效率。 5. **再次查询验证**:为了验证更新是否成功,再次执行`session.find("from User")`查询所有用户,然后...

    详解Hibernate事务处理机制

    Hibernate还允许开发者通过配置设置不同的事务隔离级别,以满足不同应用场景下的需求。常见的隔离级别包括: - `READ_UNCOMMITTED` - `READ_COMMITTED` - `REPEATABLE_READ` - `SERIALIZABLE` 这些级别的选择取决...

    hibernate-release-5.4.17.Final.zip

    1. CRUD操作:通过Session接口实现增删改查,如`session.save()`、`session.get()`、`session.update()`和`session.delete()`。 2. HQL查询:使用Query接口进行基于Hibernate Query Language的查询,支持复杂条件和...

    对Hibernate事物的理解

    在Hibernate中,关闭Session或调用Session的clear()、flush()方法时,如果之前没有显式提交事务,会自动提交当前事务。 ### 5. 事务边界与异常处理 事务的边界应定义在业务逻辑的开始和结束处,以确保在遇到异常时...

    Hibernate教程_note.pdf

    文档中还提到了数据库的隔离级别,这是数据库事务并发控制的一部分,影响着事务的隔离性以及并发性能。 通过本教程的学习,读者应该可以掌握Hibernate的基本使用方法,包括如何定义映射文件、如何操作持久化对象、...

    junit学习(十)——Springpring与Hibernate整合的单元测试

    为了模拟Hibernate的CRUD操作,我们可以先调用`Session.save()`或`Session.update()`方法,然后通过`Session.flush()`和`Session.clear()`确保数据被持久化并清空缓存。之后,通过查询验证数据是否正确存储。如果...

    NHibernate应用讲解.pdf

    - 对象修改后通过`session.Flush()`或在事务结束时自动保存更改。 #### 七、事务管理 - **事务概述**: 事务是数据库操作的一个最小单位,必须保证其原子性、一致性、隔离性和持久性。 - **使用**: - 开始事务:`...

    hibernate一级缓存

    2. **缓存与数据库的同步**:当我们调用`Session.flush()`方法时,Hibernate会将一级缓存中所有更改过的对象同步到数据库,确保数据的一致性。而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush...

    hibernate的事务核并发

    开发者可以通过设置`Session`的`setTransactionIsolationLevel()`方法或在`hibernate.cfg.xml`配置文件中指定全局的隔离级别,来控制并发行为。同时,Hibernate还支持乐观锁和悲观锁机制,通过版本字段或锁定表行的...

    如何解决hibernate自动更新实体类的问题共5页.pd

    在使用Hibernate进行Java开发时,有时会遇到一...通过调整配置、使用特定的API和理解事务隔离级别,我们可以有效地防止或控制自动更新行为,确保数据库数据的正确性。在实际开发中,应当根据项目需求选择最适合的策略。

    junit测试demo

    这可以通过使用HSQLDB等内存数据库,或者通过Hibernate的`Session.save()`和`Session.flush()`方法实现。 5. **Mocking和Stubbing**:为了减少外部依赖对测试的影响,我们可以使用Mockito等库来创建mock对象,模拟...

    Hibernate基础教程

    - **数据库隔离级别**:控制并发操作的行为,防止脏读、不可重复读等问题。 - **Session.evict(user)**:从`Session`缓存中移除指定对象。 - **解决异常**:如果从缓存中移除对象后再次操作可能会抛出异常,需要正确...

    hibernate session详细方法,值得珍藏

    在事务中执行的数据库操作,如`save()`, `update()`, `delete()`等,都会被事务隔离,并在事务提交(`commit()`)或回滚(`rollback()`)时统一处理。这种机制确保了数据的一致性和事务的原子性。 #### 二、关键...

    Hibernate学习

    - **Mysql查看数据库隔离级别**:命令`SHOW VARIABLES LIKE 'tx_isolation';`。 - **Mysql数据库修改隔离级别**:命令`SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;`。 - **Session.evict(user)方法**...

    NHibernate2.0中文教程

    2. 更新:当对象状态发生变化时,调用Session的Flush()方法将更改同步到数据库。 3. 删除:调用Session的Delete()方法删除对象,对应记录也会从数据库中移除。 4. 加载和检索:使用Session的Get()、Load()或...

    Java事务管理学习之Hibernate详解

    Session的flush()方法用于将内存中的更改同步到数据库,通常在事务结束时调用commit(),此时会触发flush(),并清理缓存。如果使用了native生成器,插入新记录后,会立即清理缓存。 以下是一个简单的示例,展示了...

Global site tag (gtag.js) - Google Analytics