Spring事务失效的几种原因_java

来源:脚本之家  责任编辑:小易  

1、首先使用如下代码 确认2113你的bean 是代理5261对象吗?必须是Spring定义(通过XML或注解4102定义都可以)的Bean才接受事1653务。直接new出来的对象添加事务是不起作用的。可以通过以下方式判断是否是代理对象:AopUtils.isAopProxy(Object object)AopUtils.isCglibProxy(Object object) //cglibAopUtils.isJdkDynamicProxy(Object object) //jdk动态代理2、入口函数必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。3、切入点配置错误。<!-- 使用annotation注解方式配置事务 --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/><!--使用切面方式配置事务--><tx:advice id="txadvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED" rollback-for="java.lang.Exception" /></tx:attributes></tx:advice><aop:config><aop:pointcut id="pointcut" expression="execution(* com.tyyd..*Service.do*(..))"/><aop:advisor advice-ref="txadvice" pointcut-ref="pointcut"/></aop:config>4、如果你使用了springmvc,可能是context:component-scan重复扫描引起的:5、如使用mysql且引擎是MyISAM造成的(因为不支持事务),改成InnoDB即可。org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only检查方法都是查询都没有异常,搜索百度了很多资料还是不解,最近2113在项目的时候碰到pring事务不起作用5261的情况,后来解决了,4102这里我汇总下:1、首先使用如下代码 确认你1653的bean 是代理对象吗?必须是Spring定义(通过XML或注解定义都可以)的Bean才接受事务。直接new出来的对象添加事务是不起作用的。可以通过以下方式判断是否是代理对象:AopUtils.isAopProxy(Object object)AopUtils.isCglibProxy(Object object) //cglibAopUtils.isJdkDynamicProxy(Object object) //jdk动态代理2、入口函数必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。3、切入点配置错误。<!-- 使用annotation注解方式配置事务 --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/><!--使用切面方式配置事务--><tx:advice id="txadvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED" rollback-for="java.lang.Exception" /> </tx:attributes></tx:advice><aop:config><aop:pointcut id="pointcut" expression="execution(* com.tyyd..*Service.do*(..))"/><aop:advisor advice-ref="txadvice" pointcut-ref="pointcut"/></aop:config> 4、如果你使用了springmvc,可能是context:component-scan重复扫描引起的:5、如使用mysql且引擎是MyISAM造成的(因为不支持事务),改成InnoDB即可。追问我看了一下 5肯定不是问题原因 都是innoDB 4我只在spring mvc里扫描注解 不存在重复扫描 3貌似我配置没错误 2没看懂 我所有dao和service的方法都是public的 1三个方法参数传入service对象全是false本回答被提问者采纳www.zgxue.com防采集请勿采集本网。

数据库引擎不支持事务

spring 的配置文件只设置一个事务就行了, 在 JAVA 的DAO 代码调用

在MySQL数据库中有几种引擎(InnoDB,MyISAM,Memory等等),仅仅InnoDB支持事务,如果数据库底层都不支持事务的话,那么再怎么折腾都是白搭.

在spring的配置里,把controller的类扫描了,为什么事务就失效了 它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。 其存储位置在/data/data/< >/shared_prefs目录下。 SharedPreferences对象本身只能获取数据而

@transactional加在private方法上

哪里有问题你也不说

@Transactional只能加在public方法上,如果需要在private方法中加入事务,可以使用Aspect配transactionManager使用.

按你的描述应该是会回滚的,我用的是注解方式不知道跟xml配置差别大不大,以下是我的配置方式 @Transactional(propagation=Propagation.REQUIRES_NEW,rollback

本类方法调本类另一个方法

一、配置如下: 1)applicationContext-common.xml Java代码

例如:

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { //check updateUserInfo(user); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateUser(User user) { // update user }}

@Transactional(propagation = Propagation.REQUIRES_NEW)是无效的,在Spring中是使用代理的方式实现事务,发生自身调用的时候,没有经过Spring的代理,自然事务失效.

不支持事务

@Servicepublic class UserServiceImpl implements UserService { @Transactional(propagation = Propagation.NOT_SUPPORTED) public void update(User user) { //do some action }}

@Transactional(propagation = Propagation.NOT_SUPPORTED)表示如果当前存在事务就挂起,以没有事务的方式运行,主动不支持事务了,那么再怎么操作也是白搭. 此处贴下Spring的传播行为:

/** * Support a current transaction, create a new one if none exists. * Analogous to EJB transaction attribute of the same name. * <p>This is the default setting of a transaction annotation. */ REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), /** * Support a current transaction, execute non-transactionally if none exists. * Analogous to EJB transaction attribute of the same name. * <p>Note: For transaction managers with transaction synchronization, * PROPAGATION_SUPPORTS is slightly different from no transaction at all, * as it defines a transaction scope that synchronization will apply for. * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc) * will be shared for the entire specified scope. Note that this depends on * the actual synchronization configuration of the transaction manager. * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization */ SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), /** * Support a current transaction, throw an exception if none exists. * Analogous to EJB transaction attribute of the same name. */ MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), /** * Create a new transaction, and suspend the current transaction if one exists. * Analogous to the EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), /** * Execute non-transactionally, suspend the current transaction if one exists. * Analogous to EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), /** * Execute non-transactionally, throw an exception if a transaction exists. * Analogous to EJB transaction attribute of the same name. */ NEVER(TransactionDefinition.PROPAGATION_NEVER), /** * Execute within a nested transaction if a current transaction exists, * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB. * <p>Note: Actual creation of a nested transaction will only work on specific * transaction managers. Out of the box, this only applies to the JDBC * DataSourceTransactionManager when working on a JDBC 3.0 driver. * Some JTA providers might support nested transactions as well. * @see org.springframework.jdbc.datasource.DataSourceTransactionManager */ NESTED(TransactionDefinition.PROPAGATION_NESTED);

异常被catch

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { try{ }catch(Exception e){ log.error(e.getMessage(),e); } }}

触发回滚的操作是被接收到异常,一般我们会在@Transactional后面加上rollbackFor或者noRollbackForClassName来指明触发回滚的异常,但是如果在代码中给catch了异常,那么对于Spring代理来说就这个方法从头到尾都没有问题,自然不会触发回滚.

异常类型错误

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { try{ }catch(Exception e){ log.error(e.getMessage(),e); throw new Exception(e.getMessage()); } }}

以上方式throw new Exception(e.getMessage());事务也是无效的,主要原因是事务回滚的条件是throw 运行时异常(RunTimeException).如果需要其他异常也回滚,需要在@Transactional后面加上rollbackFor或者noRollbackForClassName来指明触发回滚的异常.

没有被Spring管理

不在Spring环境下,自然不受Spring的管理,事务管理器也当然失去了作用.

没有配置TransactionManager

需要对当前数据源配置事务管理器,尤其是在多数据源的情况下.

以上就是Spring事务失效的几种原因的详细内容,更多关于Spring事务失效的资料请关注真格学网其它相关文章! 您可能感兴趣的文章:Spring事务失效问题分析及解决方案这一次搞懂Spring事务是如何传播的使用SpringBoot注解方式处理事务回滚实现springboot手动事务回滚的实现代码MySQL事务及Spring隔离级别实现原理详解Spring注解 TX声明式事务实现过程解析Spring事务处理原理步骤详解Springboot通过aop实现事务控制过程解析Spring如何基于aop实现事务控制Spring中的事务管理实例详解SpringMVC+MyBatis声明式事务管理Spring事务管理只对出现运行期异常进行回滚SpringBoot 注解事务声明式事务的方式

<tx:annotation-driven transaction-manager="transactionManager" />放上面那个文件检查下 你的表引擎是否支持事务ps:你的配置文件 有点乱!内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • spring boot整合spring security简单实现登入登出从零搭建教程
  • java中的rasp机制实现详解
  • java通过bcrypt加密过程详解
  • 基于retrofit+rxjava实现带进度显示的下载文件
  • java web实现登录页面验证码验证功能
  • 使用maven配置spring的方法步骤
  • spring security 实现“记住我”功能及原理解析
  • windows中tomcat整合到eclipse的图文教程
  • java压缩文件与删除文件的示例代码
  • java编程之递归算法总结
  • spring mvc 注解事务失效有哪些情况
  • 我的java项目中spring事务总是出问题?
  • 我的java项目中spring事务总是出问题是怎么回事?
  • Spring事务不起作用……
  • java中spring事务问题
  • 在spring的配置里,把controller的类扫描了,为什...
  • 我的java项目spring事务出现问题怎么办
  • java中 spring 的事务问题
  • Spring 3 + Hibernate4 事务不成功可能是哪些原因...
  • 有人碰到过spring两个service相互注入引发事务问题...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页spring事务失效问题分析及解决方案这一次搞懂spring事务是如何传播的使用springboot注解方式处理事务回滚实现springboot手动事务回滚的实现代码mysql事务及spring隔离级别实现原理详解spring注解 tx声明式事务实现过程解析spring事务处理原理步骤详解springboot通过aop实现事务控制过程解析spring如何基于aop实现事务控制spring中的事务管理实例详解springmvc+mybatis声明式事务管理spring事务管理只对出现运行期异常进行回滚springboot 注解事务声明式事务的方式spring boot整合spring security简单实现登入登出从零搭建教程java中的rasp机制实现详解java通过bcrypt加密过程详解基于retrofit+rxjava实现带进度显示的下载文件java web实现登录页面验证码验证功能使用maven配置spring的方法步骤spring security 实现“记住我”功能及原理解析windows中tomcat整合到eclipse的图文教程java压缩文件与删除文件的示例代码java编程之递归算法总结java使double保留两位小数的多方java8 十大新特性详解intellij idea 2020最新激活码(亲java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例详解spring boot工程集成全局唯一id生成器classloader类加载器_基于java类的加载方java中的== 和equals()方法详解与实例springmvc引入validation的具体步骤详解java实现远程控制技术完整源代码分享java实现分段读取文件并通过http上传的方深入理解java中的重载和覆盖java设计模式单例模式(singleton)用法解析详解java 集合系列(三)—— linkedlistspringboot自定义starter实例代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved