8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)
声明式的事务管理(AOP的主要用途之一) (Annotation的方式)
1.加入annotation.xsd
2.加入txManager bean
3.<tx:annotation-driven
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
4.在需要的事务的方法上加 : @Transactional
@Transactional
1.被注解的方法只有在抛出 运行时异常才会触发rollback,非运行时异常不会rollback
2.不管什么异常,只要你catch了,spring就会放弃管理
3.事务的传播特性 propagation_required
例如:@Transactional(propagation = Propagation.REQUIRED) 等同于(@Transactional)
作用:一个方法声明了@Transactional事务后,其内再调用方法不需要再声明@Transactional
4.read_only
例如:@Transactional(propagation = Propagation.REQUIRED,readOnly=true)
当方法声明为 readOnly = true 时,该方法及其调用的方法内都不执行 insert update等
//使用 @Transactional 注解 ,声明 需要进行事务管理的方法
//事务管理,同样体现了 AOP ,即在方法的执行前后,加上事务开启 和 事务关闭语句,如果发现了 运行时异常,就会rollback
//为什么在这里事务管理要放到 Service层,不放到DAO层:1.因为该add方法牵扯到了多个DAO,里面有setMsg方法 和 save方法,要保证这两个方法 ‘荣辱与共’
//所以 service 的 add 方法需要 进行事务管理,
//如果 add 方法中,只用到了一个DAO,那么只需要在 该 DAO 需要 进行事务管理的方法上进行 管理即可 //事务的传播特性:
//@Transactional(propagation=Propagation.REQUIRED) == (@Transactional)
//一个方法声明了 @Transactional 事务后,其内再调用的方法不需要再声明 @Transactional
//别人调 add 方法,如果这个add方法之前 ,如果说已经有了一个 transaction,就用原来那个,如果没有(在UserService中没有事务),就创建一个新的(即需要(required)的时候才创建) //read_only
//当方法声明 readOnly=true时,就产生一个 只读 的 connection ,当方法内部只有读取的业务时,可以使用,提高性能 @Transactional(propagation=Propagation.REQUIRED,readOnly=true)
public void add(User user) {
Log log = new Log();
log.setMsg("logmsg");
logDAO.saveMsg(log);
userDAO.save(user);
}
5.需要注意,使用事务后,Hibernate 获得 session时要使用getCurrentSession,不能使用openSession
为什么?:使用事务后,不能使用openSession,否则可能会创建一个新的session,无法保证和后面的方法是在同一个事务中
 @Component("userDAO")
 public class UserDAOImpl implements UserDAO{
     private SessionFactory sessionFactory;
     public SessionFactory getSessionFactory() {
         return sessionFactory;
     }
     //在DAO中 注入 setSessionFactory
     @Resource
     public void setSessionFactory(SessionFactory sessionFactory) {
         this.sessionFactory = sessionFactory;
     }
     @Override
     public void save(User user) {
     //注:使用事务后,不能使用 openSession,否则会 创建一个 新的session,无法保证和后面的方法是在同一事务中
         Session session = sessionFactory.getCurrentSession();
         session.save(user);
         System.out.println(sessionFactory.getClass());
         System.out.println("a user saved");
         //1.运行期异常,非运行期异常不会触发rollback
         throw new RuntimeException("1");
     }
 }
8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)的更多相关文章
- 9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)
		使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> <!-- 不管是 ... 
- Spring整合Hibernate 二 - 声明式的事务管理
		Spring大战Hibernate之声明式的事务管理 Spring配置文件: 添加事务管理类的bean: <bean id="txManager" class="o ... 
- spring声明式的事务管理
		spring支持声明式事务管理和编程式事务管理两种方式. 编程式事务使用TransactionTemplate来定义,可在代码级别对事务进行定义. 声明式事务基于aop来实现,缺点是其最细粒度的事务声 ... 
- Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理
		1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ... 
- Spring整合JMS(四)——事务管理
		原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ... 
- Spring整合JMS(四)——事务管理(转)
		*注:别人那复制来的 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.Jm ... 
- mybatis、Spring整合(eclipse)以及事务管理
		1.项目目录 2.jar包 dbcp:连接池 pool:连接池 logging:日志 log4j:日志 mybatis-spring:用于SqlSession等相关操作 spring相关包 mybat ... 
- Spring整合hibernate:3、使用XML进行声明式的事务管理
		配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ... 
- 11、Spring教程之声明式事务
		1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ... 
随机推荐
- Ubuntu16.04安装vmware pro 15激活码
			VMware Workstation Pro 15 激活许可证UY758-0RXEQ-M81WP-8ZM7Z-Y3HDAVF750-4MX5Q-488DQ-9WZE9-ZY2D6UU54R-FVD91 ... 
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_02-freemarker介绍
- CentOS7使用yum安装mysql5.7
			提前说一下,网速不好不要用yum安装,等得时间太长. 第一步.获取yum源 [root@youxi1 ~]# rpm -ivh https://repo.mysql.com/yum/mysql-5.7 ... 
- 通过举例了解java中的流
			Java流结构介绍: Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型. 字节流 字符流 输入流 InputStream Reader 输出流 OutputStream W ... 
- Jmeter 逻辑控制器 之 吞吐量控制器
			吞吐量控制器 听起来好像比较难理解或者比较高深,其实它非常简单,今天我仔细看了下帮助,分享下对它的理解. 一.认识吞吐量控制器 作用:控制其下子样例执行的频次,有两种控制模式,一种是直接设置数值,一种 ... 
- HTML-T
			a标签跳转 <a href="new_link" target="_blank">在新建页面打开链接</a>. <a href=& ... 
- 【并行计算-CUDA开发】英伟达硬件解码器分析
			这篇文章主要分析 NVCUVID 提供的解码器,里面提到的所有的源文件都可以在英伟达的 nvenc_sdk 中找到. 解码器的代码分析 SDK 中的 sample 文件夹下的 NvTranscoder ... 
- 最新 智联java校招面经 (含整理过的面试题大全)
			从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.智联等10家互联网公司的校招Offer,因为某些自身原因最终选择了智联.6.7月主要是做系统复习.项目复盘.LeetCode ... 
- springBoot--组合注解RestController,GetMapping,PostMapping
			一.RestController @RestController 是@Controller和@ResponseBody的缩写 二.@getMapping和PostMapping @GetMapping ... 
- list集合的一些小见解
			关于LIst集合 前言: 第一次写博客,有些东西可能总结的到位,发表一下自己的一些观点,欢迎大佬们点评和指教 正文: list集合可以分为ArrayLlst和LinkedList. ArrayList ... 
