hibernate中事务隔离级别

  • 1:读未提交
  • 2:读已提交
  • 4:可重复读
  • 8:可串行化

hibernate事务使用

  1. 在核心配置文件中配置事务隔离级别
    1. <property name="hibernate.connection.isolation">4</property>
  2. 确保一个逻辑事务中的session是同一个
    1. 核心配置文件中配置事务当前线程绑定session:<property name="hibernate.current_session_context_class" >thread</property>
    2. 通过sessionFactory.getCurrentSession()来获取session(getCurrentSession()方法默认不开启,必须配置事务当前线程绑定session来开启)
  3. 注:使用getCurrentSession()方法获取的session操作完不需要关闭,线程结束会自动关闭

核心配置文件hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url" >jdbc:mysql:///test02</property>
<property name="hibernate.connection.username" >root</property>
<property name="hibernate.connection.password" >root</property>
<property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto" >create</property>
<property name="hibernate.show_sql" >true</property>
<!-- <property name="hibernate.format_sql" >true</property> --> <property name="hibernate.connection.isolation">4</property>
<property name="hibernate.current_session_context_class" >thread</property> <mapping resource="com/qf/entity/Teacher.hbm.xml"/>
<mapping resource="com/qf/entity/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

sessionFactory.getCurrentSession()方法的实现

内部使用了ThreadLocal来实现线程绑定session

public Session getCurrentSession() throws HibernateException {
if ( currentSessionContext == null ) {
throw new HibernateException( "No CurrentSessionContext configured!" );
}
return currentSessionContext.currentSession();
} 
@Override
public final Session currentSession() throws HibernateException {
Session current = existingSession( factory() );
if ( current == null ) {
current = buildOrObtainSession();
// register a cleanup sync
current.getTransaction().registerSynchronization( buildCleanupSynch() );
// wrap the session in the transaction-protection proxy
if ( needsWrapping( current ) ) {
current = wrap( current );
}
// then bind it
doBind( current, factory() );
}
else {
validateExistingSession( current );
}
return current;
}

1. 测试getCurrentSession()方法获取的session操作完是否会自己关闭

@Test
public void test() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.getCurrentSession(); Transaction tx = session.beginTransaction(); Student student = session.get(Student.class, 1L);
System.out.println(student);
tx.commit();
session.close();
}

-------------------------------------Junit-----------------------------------------

org.hibernate.SessionException: Session was already closed

线程结束,session已经自己关闭了,不需要再去手动关闭

2. 测试两次通过getCurrentSession()方法获取的session是否一致

@Test
public void test() {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory(); Session session1 = factory.getCurrentSession();
Session session2 = factory.getCurrentSession();
System.out.println("两次通过getCurrentSession()获取的session是否一致:"+(session1==session2)); Session session3 = factory.openSession();
Session session4 = factory.openSession();
System.out.println("两次通过openSession()获取的session是否一致:"+(session3==session4));
} 

-------------------------------------console-----------------------------------------

两次通过getCurrentSession()获取的session是否一致:true
两次通过openSession()获取的session是否一致:false

  

七、hibernate的事务使用的更多相关文章

  1. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  2. (转载)Hibernate的事务管理

    Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...

  3. atitit.spring hibernate的事务机制 spring不能保存对象的解决

    atitit.spring hibernate的事务机制 spring不能保存对象的解决 sessionFactory.openSession() 不能..log黑头马sql语言.. sessionF ...

  4. Hibernate学习笔记(三)—— Hibernate的事务控制

    Hibernate是对JDBC的轻量级封装,其主要功能是操作数据库.在操作数据库过程中,经常会遇到事务处理的问题,接下来就来介绍Hibernate中的事务管理. 在学习Hibernate中的事务处理之 ...

  5. Hibernate的事务管理

    Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...

  6. JavaWeb_(Hibernate框架)Hibernate中事务

    Hibernate中事务 事务的性质 事物的隔离级别 配置事务的隔离级别 事务的性质 原子性:原子,不可再分,一个操作不能分为更小的操作,要么全都执行,要么全不执行. 一致性:事务在完成时,必须使得所 ...

  7. 事务种类jdbc,Hibernate,JTA事务

    JDBC事务 String URL="jdbc:sqlserver://localhost:1433;databaseName=test2"; String USER=" ...

  8. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...

  9. 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】

    一.Spring整合Hibernate 1.如果一个DAO 类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了:如果一个DAO类没有 ...

随机推荐

  1. 【转载】关于Maven项目build时出现No compiler is provided in this environment的处理

    参考地址;https://blog.csdn.net/lslk9898/article/details/73836745

  2. 246-基于TI DSP TMS320C6678、Altera FPGA的CPCI处理卡

    基于TI DSP TMS320C6678.Altera FPGA的CPCI处理卡 1.板卡概述  本板卡由我公司自主研发,基于CPCI架构,符合CPCI2.0标准,采用两片TI DSP TMS320C ...

  3. 生成RSA公钥密钥

    非对称加密就不做详细解释了,它的过程简单来说呢,就是A与B通讯,A公布了一个公开密钥,而且A手里还有一个私有的钥匙,叫密钥.B使用A给的公钥将内容进行加密,然后传递给A.A拿到加密后的内容后,用私钥解 ...

  4. vscode舒适的字体风格

    首选项-->设置-->输入setting.json-->查找到设置文件 添加如下配置 "editor.tabSize": 2, "files.assoc ...

  5. ConcurrentLinkedDeque

    import java.util.concurrent.ConcurrentLinkedDeque; /** * ConcurrentLinkedQueue : 是一个适用于高并发场景下的队列,通过无 ...

  6. Gitbook环境搭建及制作——2019年10月24日

    1.gitbook介绍 GitBook 是一个基于 Node.js 的命令行工具,支持 Markdown 和 AsciiDoc 两种语法格式,可以输出 HTML.PDF.eBook 等格式的电子书.可 ...

  7. 【Eureka】实现原理

    Eureka Client 拉取Eureka Server中的全量注册表 注册自身实例InstanceInfo至Eureka Server 初始化定时任务 心跳(续约)任务 拉取增量注册表更新本地注册 ...

  8. 英语单词collaboration

    collaboration 来源——github网站 https://guides.github.com/activities/hello-world/ GitHub is the best way ...

  9. python3运行报错:TypeError: Object of type 'type' is not JSON serializable解决方法(详细)

    返回结果先转成str 字符创

  10. Redis事件通知示例

    1. redis如同zk一样,提供了事件监听(或者说是回调机制), 下面是redis的配置说明: ############################# EVENT NOTIFICATION ## ...