//Hibernate事务管理//
-
事务
-
设置事务级别
-
事务服务层连接
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);
}
}
它,
不仅仅是一个码