【Log历练手册】Spring事务管理不能提交异常

Bug记录

使用@Transactional之后,事务不能提交,费了一番功夫发现是@Transactional(value=”“)这条信息配错,事务管理器没有正常启用

xml配置文件

配置文件如下

<bean id="transactionManager4Demo"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource4Demo" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager4Demo" />

配置文件如下说明如下

<tx:annotation-driven>一共有四个属性如下,

mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理 


order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。 

transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用

<tx:annotation-driven/>默认使用transactionManager的事务管理器,若bean id命名为transactionManager则不需要设置transaction-manager="transactionManager4Demo"

Spring@Transactional

事务支持属性如下

属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor implements Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor implements Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

传播行为

Propagation.REQUIRED:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

Propagation.SUPPORTS: 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行

Propagation.MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常

Propagation.REQUIRES_NEW:表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

Propagation.NOT_SUPPORTED:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

Propagation.NEVER:表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常

Propagation.NESTED:表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与Propagation.REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务

posted @ 2016-11-29 22:21  写昵称不如写代码  阅读(113)  评论(0编辑  收藏  举报