专栏首页IT那个小笔记Hibernate事务配置

Hibernate事务配置

//

Hibernate事务管理

//

  1. 事务
  2. 设置事务级别
  3. 事务服务层连接

01

事务

什么是事务?

逻辑上的一组操作,要么一起成功,要么就都不算。不能有的执行了,有的没执行

事务的特性?

原子性

事务不能分隔

隔离性

执行一个事务时, 不应受到其它事务的干扰

一致性

事务执行前后 ,数据的完整性要保持一致

持久性

操作完成后就在数据库中

事务的隔离级别?

Read uncommitted

所有问题都会发生

Read committed

解决脏读问题

Repeatable read

解决脏读和不可重复读

Serializable

解决所有问题,效率较低

隔离级别详细SQL事务

02

设置事务隔离级别

在核心配置文件hibernate.cfg.xml当中

通过数字来代表不同的隔离级别

<property name="hibernate.connection.isolation">4</property>

设置的值是1,2,3,4代表四个隔离级别

03

事务业务层连接

为什么在服务层使用事务?

在dao层的工作是连接数据库做各个基本功能,比如增删改查等。而服务层的作用才是去组织dao的小功能去实现完整的业务逻辑并返回结果给web层

在外部处理时session怎么保持一致?

因为开启事务需要session所以服务层需要用到session,而且事务里面语句用的session也应该是一个。那么怎么能保证服务层用的session和事务中两个方法的session一样呢?

首先很容易想到的就是从上往下传递的方式

TestService{
    Session session = HibernateUtil.openSession();
    dao.session = session;
    test(){
        Transaction tra = session.beginTransaction();
        dao.insertMoney();
        dao.update();
        tra.commit();
    }
public TestDao{    public static Session session;    public void insertMoney(){
        session.save(obj);
    }    
    public void insertMoney(){
        session.save(obj);
    }

}

但这样有点太笨重,在Hibernate内部绑定了个session在ThreadLocal,也就是说在一次完整请求中即是在一次线程上有一个session,只需要获取这个session那肯定就是同一个session了

默认这个是关闭的,需要在核心配置文件打开

<property name="current_session_context_class">thread</property>

并且这个session不需要手动关闭,执行完后会自动关闭

TestService{

    SessionFactory sf = HibernateUtil.getSessionFactory(); 
    test(){
        Transaction tra = sf.getCurrenSession().beginTransaction();
        dao.insertMoney();
        dao.update();
        tra.commit();
    }
}
public TestDao{    
    SessionFactory sf = Hibernate.getSessionFactory();    public void insertMoney(){   
       sf.getCurrentSession().session.save(obj); 
    }       
    public void insertMoney(){  
       sf.getCurrentSession().session.save(obj);  
    } 
}

本文分享自微信公众号 - IT那个小笔记(qq1839646816),作者:木瓜煲鸡脚

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tomcat服务器体系结构

    server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组件,通过对xml文件中元素的配置,可以实现对...

    木瓜煲鸡脚
  • 代码块和final关键字

    若该类有父类则在创建该类对象即调用该类的构造方法时会先调用父类构造方法。即堆中会出现两个对象

    木瓜煲鸡脚
  • 会话技术

    用户开一个浏览器,点击多个超链接,访问服务器多个web资,到最后关闭浏览器,整个过程称之为一个会话。和打电话一样,电话接收,开始会话,电话 挂断,结...

    木瓜煲鸡脚
  • 解决nginx负载均衡的session共享问题

    查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享

    后端技术探索
  • 程序员过关斩将--解决分布式session问题

    说到 session,我相信每个程序员都不陌生,或多或少在项目中使用过。session 这个词,其实是一个抽象的概念,它不像 Cookie 那样有着明确的定义。...

    架构师修行之路
  • [PHP] session_write_close()的作用

    简单地说,当开启session_start以后,这个session会一直开启,并且被一个用户使用。其他用户开启session的话要等待第一个session用户关...

    陶士涵
  • php session_decode函数用法讲解

    session_decode() 对 data 参数中的已经序列化的会话数据进行解码, 并且使用解码后的数据填充 _SESSION 超级全局变量。

    砸漏
  • PHP设置Redis储存Session

    我们在之前的文章已经讲到了session是将数据储存在本地文件中,并且将session_id返回给客户端(浏览器会储存在cookies里)。

    仙士可
  • cookie和session

    cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道...

    用户1173509
  • PHP设置Redis储存Session,自定义session驱动

    我们在之前的文章已经讲到了session是将数据储存在本地文件中,并且将session_id返回给客户端(浏览器会储存在cookies里)。

    宣言言言

扫码关注云+社区

领取腾讯云代金券