首页天道酬勤@transactional注解失效,transactional注解失效原因

@transactional注解失效,transactional注解失效原因

张世龙 05-06 01:22 73次浏览

@Transactional 注解相信大家并不陌生,平时Spring开发中很常用的一个注解,它能保证方法内多个数据库操作的事务性和原子性。任何情况下@Transactional都能保证数据库操作的事务性和原子性么?显然并不是这样,我们使用@Transactional注解时需要注意许多的细节,不然你会发现@Transactional莫名其妙的就失效了。

@Transactional注释可以应用于哪里? 33558 www.Sina.com/: @向类释放transactional注释时,表示该类的所有公共方法都将放置相同的事务属性信息。

作用于类:在类中放置@Transactional时,方法也放置@Transactional,方法的事务覆盖类的事务配置信息。

作用于方法:我不推荐这样使用。 作用范围太大,有些接口可能不需要回滚。 如果标记为接口并将Spring AOP设置为使用CGLib动态代理,则会禁用@Transactional注释。

Transactional事务传播行为http://www.Sina.com/propagation.required :如果当前存在事务,则参与该事务;如果当前不存在事务,则参与新事务如果同时为3358www.Sina.com/或a和b方法添加了注释,则在默认传播模式下,a方法在内部调用b方法,将两个方法的事务处理作为一个事务处理3358

Propagation.SUPPORTS :参与事务(如果当前存在事务); 如果事务当前不存在,请使用事务以外的其他方法继续执行。

Propagation.MANDATORY :参与事务(如果当前存在事务); 如果事务当前不存在,则抛出异常。

Propagation.REQUIRES_NEW :重新创建新事务,如果当前事务存在,则暂停当前事务。 3358www.Sina.com/类的a方法使用缺省的Propagation.REQUIRED模式,b类的b方法使用Propagation.REQUIRES_NEW模式,然后a类方法

Propagation.NOT_SUPPORTED :作为非事务执行,如果当前事务存在,则暂停当前事务。

Propagation.NEVER :作为非事务执行,如果当前存在事务,则抛出异常。

propagation.nested :效果与propagation.required相同。

在Transactional禁用方案中,如果第一个Transactional注释的标注方法修饰符是非公共的,则@Transactional注释将被禁用

注:如果在protected、private限定的方法中使用@Transactional注释,则事务无效,但没有错误。 这是我们允许错误的一点。

@ transactional @ overridevoidcreateuser (userdtouserdto ) { int a=1; 用户用户=new user (; beanutils.copy properties (userd to,user ); 用户映射器. insert (user; if(a==1) thrownewapplicationexception ('-1 ','新增失败',null ); }在类内部调用@Transactional标记的第二种方法。 在这种情况下,事务也将无法打开。 示例代码如下

@ overridepubliccommonresultcreateuser (userdtouserdto )//在类内部调用@Transactional标记的方法。 insert (用户到; returncommonresult.builder (.code ) responsecode.success.getcode ) ).message ) response code.success.getmessage } beanutils.copy properties (userd to,user ); //常规公共修饰符的事务方法usermapper.insert(user ); int a=1; if(a0 ) thrownewapplicationexception ('-1 ','新增失败',null ); }第三个事务处理方法在内部捕获异常,没有抛出新的异常,因此事务处理操作不会回滚

@ transactional (roll back for=application exception.class ) overridepubliccommonresultcreateuser ) userdtouserdto (try beanto ) //常规公共修饰符的事务方法usermapper.insert(user ); int a=1; if(a0 ) thrownewapplicationexception ('-1 ','新增失败',null ); }catch(exceptione ) thrownewapplicationexception ('-1 ','新增失败',null ); } returncommonresult.builder (.code ) responsecode.success.getcode ) ).message ) responsecode.succcess.getmess )

此禁用是由配置错误引起的,如果错误配置了以下三种类型的传播,则不会回滚事务:

transaction definition.propagation _ supports :加入事务(如果当前存在事务); 如果当前没有事务,请使用事务以外的其他方法继续执行。 transaction definition.propagation _ not _ supported :在非事务中执行,如果当前事务存在,则挂起当前事务。 transaction definition.propagation _ never :在非事务中执行,如果当前存在事务,则抛出异常。

设置第五个@Transactional注释属性rollbackFor时出错

使用rollbackFor可以指定引起事务回滚的异常类型。 默认情况下,Spring抛出未检查的未检查异常(从运行时执行继承的异常)或Error回退事务; 其他异常不会触发回滚事务。 如果事务抛出其他类型的异常,并希望Spring能够回滚事务,则必须指定rollbackFor属性。

不支持第六个数据库

spring事务回滚注解,Spring事务注解