声明式的事务管理(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的方式)的更多相关文章

  1. 9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)

    使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> <!-- 不管是 ...

  2. Spring整合Hibernate 二 - 声明式的事务管理

    Spring大战Hibernate之声明式的事务管理 Spring配置文件: 添加事务管理类的bean: <bean id="txManager" class="o ...

  3. spring声明式的事务管理

    spring支持声明式事务管理和编程式事务管理两种方式. 编程式事务使用TransactionTemplate来定义,可在代码级别对事务进行定义. 声明式事务基于aop来实现,缺点是其最细粒度的事务声 ...

  4. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  5. Spring整合JMS(四)——事务管理

    原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...

  6. Spring整合JMS(四)——事务管理(转)

    *注:别人那复制来的 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.Jm ...

  7. mybatis、Spring整合(eclipse)以及事务管理

    1.项目目录 2.jar包 dbcp:连接池 pool:连接池 logging:日志 log4j:日志 mybatis-spring:用于SqlSession等相关操作 spring相关包 mybat ...

  8. 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 ...

  9. 11、Spring教程之声明式事务

    1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ...

随机推荐

  1. Qt编写安防视频监控系统9-自动隐藏光标

    一.前言 这个效果的灵感来自于大屏电子看板系统,在很多系统中尤其是上了大屏的时候,其实在用户不在操作的时候,是很不希望看到那个鼠标箭头指针的,只有当用户操作的时候才显示出来,这个就需要开个定时器定时计 ...

  2. PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

    1016 Phone Bills (25 分)   A long-distance telephone company charges its customers by the following r ...

  3. Ubuntu 18.04 上使用xrdp远程桌面连接

    参考:https://blog.csdn.net/qq_25556149/article/details/82216190 1,环境查看 2,安装 xrdp.tightvncserver apt-ge ...

  4. python基础----redis模块

    数据库 关系型数据 例如mysql,有表还有约束条件等 非关系型 k-v形式 memcache 存在内存中 redis 存在内存 mongodb 数据存在磁盘 import redis #string ...

  5. Flutter Window环境运行(VSCode + 单独运行Android 虚拟机)

    官网以及很多网上文章的开发都是基于Android ,因为它能创建不同类型移动设备虚拟机.但个人始终觉得它太庞大,启动慢耗资源,但我们使用Flutter又离不开虚拟机. 经过实践,现在能成功的单独启动移 ...

  6. 合并多个tensorflow模型的办法

    直接上代码: import tensorflow as tf from tensorflow.python.tools import freeze_graph from tensorflow.pyth ...

  7. 【转】MySql 三大知识点——索引、锁、事务

    索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. 索引的优点:1. 天生排序.2. 快速查找. 索引的缺点:1. 占用空间.2. 降低更新表的速度. 注意点:小表使用全表扫描更快 ...

  8. 监听input框变化,即时搜索 compositionstart, compositionend

    前话: 如果直接通过input监听, 它是键盘输入按键按下了就触发时间,这样可能导致一些问题,比如在谷歌浏览器想输入中文输入不了: 解决方案: 用 compositionstart 和 composi ...

  9. 双端队列 【deque】

    题目链接:https://ac.nowcoder.com/acm/contest/1071/D 还是第一次简单运用双端队列.顾名思义:队列的头尾都可以进行插入跟删除操作. 存在于头文件 deque 中 ...

  10. SQL Server 学习之环境搭建

    SQL Server 环境搭建 说明:本文是sqlServer的安装和测试环境的搭建 版本是SQLServer 2005版,由于该版本只能在Windows7或者更低的系统上才能安装,更高的系统请安装S ...