Hibernate事务配置
小编:管理员 594阅读 2022.09.14
//
Hibernate事务管理
//
- 事务
- 设置事务级别
- 事务服务层连接
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); } }复制
相关推荐
- 经典笔试题-JDBC及Hibernate篇 五、JDBC 及Hibernate:(共12 题:基础10 道,中等难度2 道)110、数据库,比如100 用户同时来访,要采取什么技术解决?【基础】 答:可采用连接池。111、什么是ORM?【基础】 答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象…
- 3DMAX提示和技巧 本主题标识使用 Civil View 的一些重要提示和技巧。常规使用屏幕分辨率至少为 1280x1024 的 Civil View。低于此分辨率时,一些面板将占用过多屏幕空间。 将视口设置为线框显示以达到最佳性能。 要尽可能简化用户界面,请在单个视口中工作并关闭 3ds Max 命令面…