Hibernate事务配置

小编:管理员 594阅读 2022.09.14

//

Hibernate事务管理

//

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

01

事务

什么是事务?

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

事务的特性?

原子性

事务不能分隔

隔离性

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

一致性

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

持久性

操作完成后就在数据库中

事务的隔离级别?

Read uncommitted

所有问题都会发生

Read committed

解决脏读问题

Repeatable read

解决脏读和不可重复读

Serializable

解决所有问题,效率较低

隔离级别详细SQL事务

02

设置事务隔离级别

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

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

4
复制

设置的值是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了

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

thread
复制

并且这个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);  
    } 
}
复制
关联标签: