spring事务管理

Transaction 事务回滚无效,常见原因!!!

梦想与她 提交于 2020-03-03 05:28:54
今天使用@Transcation注解的形式为serivce服务添加事物,但是无论如何都无法回滚! 在网上找了很多帖子,自己总结了一下. 开始说事务之前,不得不提一下java的异常类型: 分为checked异常和unchecked异常 checked异常:非系统原因造成的异常,比如需要Try - catch处理,或者throws抛出到上一层去,继承自java.lang.Exception(不包括java.lang.RuntimeException) unchecked异常:系统原因自己造成的异常,如空指针异常,类型转换异常等,不需要在系统中显示的捕获处理。继承自java.lang.RuntimeException 下面是注解形式的事物在Spring中的配置 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">

Spring4

浪尽此生 提交于 2020-03-03 05:11:51
spring事务管理器: 一、基本原理:拦截指定方法,在方法执行之前,会先获取一个session,并绑定到当前线程中,并通过该session打开一个事务。在方法执行之后,先获取到当前线程中的session,并通过session获取已经打开的事务,然后提交/回滚事务,最后关闭session。 二、事务管理器类型: 1、Hibernate事务管理器:HibernateTransactionManager 2、JDBC事务管理器:DataSourceTransactionManager 三、spring配置hibernate声明式事务: 1、配置Hibernate事务管理器。 2、配置spring特有的事务管理的通知,在通知中指定事务传播机制。 3、使用spring aop在指定的切点上应用事务。 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 寻找advice 重复代码 横切性关注点--> <tx:advice id="txAdvice" transaction-manager=

SpringAOP声明式事务控制:xml配置(spring提供的事务管理器)

痞子三分冷 提交于 2020-03-03 04:00:29
文章目录 1. 创建 spring 的配置文件并导入约束 2. 编写业务层,持久层 3. 在配置文件中配置业务层和持久层对 4. spring中基于XML的声明式事务控制配置步骤 1. 创建 spring 的配置文件并导入约束 此处需要导入 aop 和 tx 两个名称空间 < ? xml version = "1.0" encoding = "UTF-8" ? > < beans xmlns = "http://www.springframework.org/schema/beans" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns : aop = "http://www.springframework.org/schema/aop" xmlns : tx = "http://www.springframework.org/schema/tx" xsi : schemaLocation = "http : / / www . springframework . org / schema / beans http : / / www . springframework . org / schema / beans / spring - beans . xsd http : / / www .

spring事务失效

谁都会走 提交于 2020-03-02 20:45:15
最近在做spring 项目中突然发现事务在遇到异常是没有回滚而是提交了,在查了大量的资料之后,算是有了一点头绪,写下来方便以后查找: 前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的。因此专门写此篇帖子分析why。 1、预备知识 aop概念请参考【 http://www.iteye.com/topic/1122401 】和【 http://jinnianshilongnian.iteye.com/blog/1418596 】 spring的事务管理,请参考【 http://jinnianshilongnian.iteye.com/blog/1441271 】 使用AOP 代理后的方法调用执行流程,如图所示 也就是说我们首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。 2、测试代码准备 Java代码 public interface AService { public void a(); public void b(); } @Service() public class AServiceImpl1 implements AService

Spring事务失效

倖福魔咒の 提交于 2020-03-02 18:05:31
面试必备技能:JDK动态代理给Spring事务埋下的坑 一、场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1、场景A: 这里其实是分别执行了两个事物,执行的结果是两个方法都可以插入数据!如下: 2、场景B: 修改上述代码如下: Propagation.REQUIRES_NEW的含义表示:如果当前存在事务,则挂起当前事务并且开启一个新事物继续执行,新事物执行完毕之后,然后在缓刑之前挂起的事务,如果当前不存在事务的话,则开启一个新事物。 执行的结果是两个方法都可以插入数据!执行结果如下: 场景A和场景B都是正常的执行,期间没有发生任何的回滚,假如child()方法中出现了异常! 3、场景C 修改child()的代码如下所示,其他代码和场景B一样: 执行结果如下,会出现异常,并且数据都没有插入进去: 疑问1:场景C中child()抛出了异常,但是parent()没有抛出异常,按道理是不是应该parent()提交成功而child()回滚? 可能有的小伙伴要说了,child()抛出了异常在parent()没有进行捕获,造成了parent()也是抛出了异常了的!所以他们两个都会回滚! 4、场景D 按照上述小伙伴的疑问这个时候,如果对parent()方法修改

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

风流意气都作罢 提交于 2020-03-02 09:42:20
@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。 @Service @Transactional(readOnly = true) public class AppTradeRec2Service extends BaseService { @Autowired private AppTradeRecDao appTradeRecDao; @Autowired private ConsInfoDao consInfoDao; @Transactional(readOnly = false) public void payCharge(TradeRec tradeRec) { User usr = UserUtils.getUser(); ConsInfo cons = consInfoDao.getByUser(usr.getId()); //修改交易记录 tradeRec.setPayBefore(cons.getAccountAmt()); tradeRec.setPayAfter(cons.getAccountAmt() - tradeRec

Spring HibernateTemplate 事务处理

孤人 提交于 2020-03-02 07:33:38
在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的。在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为 Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务 ,假如你不想每次都手动提交事务的话, 你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交 : <property name="hibernate.connection.autocommit">true</property> 当我们Spring对我们的Hibernate进行整合之后,我们的代码又出现了什么变化呢?整合,之后, 我们不再是每次都去拿Session进行数据操作了,也不需要每次都开启事务,提交事务了,我们只需要Spring给我们提供的一个HibernateTemplate ,我们直接用这个类里面给我们提供的数据操作方法就可以操作数据了。 我们在也看不到关于事务的代码了(spring 封装了事务处理) ,那Spring究竟有没有在他的操作方法里面封装事务处理呢?有的人直接HibernateTemplate里面提供的方法操作数据,成功了,有的人却又失败了,这到底是怎么回事呢

spring tranaction 事务入门

删除回忆录丶 提交于 2020-03-01 15:00:28
一、事务四个属性 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使 数据库 从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对 数据库 中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 二、事务的重要性 打个最简单的比方吧,A和B两人之间的支付宝转账问题,A向B转账50RMB,正常的结果是,A - 50 并且 B + 50; 但如果是下面这种情况,那就杯具了,A - 50 成功,而B + 50 失败。这样一来岂不是 A亏大了!谁还敢随意转账?就算是首富,也不敢随意转账O(∩_∩)O哈! 所以,在进行 A - 50 和 B + 50 需要添加事务管理。 三、先看下没有加事务的Demo, 看完就知道事务的重要性啦~ (1)、整体结构、 (2)、jar 包 (3)、SQL语句 创建数据库 create database spring; 建立表 create table countmoney

Spring+MyBatis整合

一笑奈何 提交于 2020-03-01 09:59:05
一、准备工作   1.1准备jar包            建表语句: CREATE TABLE `t_customer` ( `id` int(32) NOT NULL AUTO_INCREMENT, `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `jobs` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `phone` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;   1.2编写配置文件:     1.2.1db.properties    #dataSource #Thu Mar 07 16:27:40 CST 2019 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/sm jdbc.username=root jdbc

源代码解读Spring只读事务与读写事务的性能的差别

放肆的年华 提交于 2020-03-01 09:38:36
前言: 如果大家使用过Spring事务管理,会发现Spring提供的事务分为“只读”和“读写”事务两类。这不免就会疑问这两种事务会有什么不同?本文则通过对Spring和Hibernate源代码的剖析来找出这两种事务的区别。特别是运行性能方面的区别。 解读的源代码版本为 Spring 2.5.6.SEC01 ,Hibernate 3.3.2.GA。 Spring对事务的支持也分编程式和声明式,本文以基于Annotation方式的声明式事务为例: Spring的配置如下: < bean class ="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" > < property name ="proxyTargetClass" value ="true" ></ property > </ bean > < bean id ="entityManagerFactory" class ="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" > < property name ="persistenceUnitName" value ="entityManager" /> < property name =