Spring采用AOP机制完成事务控制。
可以实现在不修改原有组件代码情况下,实现事物控制功能。
Spring提供了2种事物管理方式:
a.编程式事务管理(编写Java代码)
TransactionTemplate
b.声明式事务管理(编写配置)
XML版本配置
注解版本配置
–配置DataSourceTransactionManager
–开启事务注解配置< tx:annotation>(<与tx之间无空格)
–在目标组件方法前添加@Transactional
<bean id="dbcp"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="root"></property>
<property name="password" value="123"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///cloud_note?userUnicode=true&characterEncoding=utf8"></property>
</bean>
<!-- 配置事务管理组件DataSourceTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbcp"></property>
</bean>
<!-- 开启事务注解标记@Transactional -->
<!-- 当调用带@Transactional标记的方法时,将txManager事务管理功能切入进去 -->
<!--
<tx:annotation-driven transaction-manager="txManager"/>
-->
<!-- XML版本配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="regist"/>
<tx:method name="load*"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="target" expression="within(org.tarena.note.service..*)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="target"/>
</aop:config>
Spring对事务管理的控制
a.控制事务可读可写特性
spring分为可读写事务和只读事务
默认为可读写,一般只涉及查询操作,建议用只读事务
@Transactional(readOnly=true)
b.控制事务是否回滚
Spring遇到RuntimeException异常,会事务回滚;遇到非运行时异常不会事务回滚。
RuntimeException:空指针,类型转换异常…
@Transactional(rollbackFor=IOException.class)//遇到IOException,也会发生回滚。
建议:自定义异常从RuntimeException继承,这样不用加rollbackFor
c.控制事务传播类型
遇到带有事务控制方法调用另一个事务控制方法时,可以选择合适的传播类型。
默认是REQUIRED类型,后者使用前者事务。
d.控制事务隔离级别
由低到高如下:
READ_UNCOMMITED//读未提交
READ_COMMITED//读已提交
REPEATABLE_READ//可重复读
SERIALIZABLE//序列化
DEFAULT默认,根据数据库隔离级别自动选择。Oracle为READ_COMMITED
isolation=Isolation.READ_UNCOMMITED
级别越高,安全性越高,但处理效率越低;
级别越低,安全性越差,但处理效率越高;
平时使用建议采用默认default,遇到特殊问题,再采用加锁机制处理