本文仅为日常工作中的札记。记录日常工作中的知识点。
spring 配置文件
- 使用cglib的aop方式启动声明式事务
<!-- 数据源上的事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 启动注解事务(声明式)模式,proxy-targ-class=true 启用cglib aop模式,transcation-manager配置指定的事务管理器 -->
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
- 使用aspectj的load time时aop方式启动声明式事务
spring xml配置文件
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- transaction-manager缺省值transactionManager -- >
<tx:annotation-driven mode="aspectj" />
pom.xml文件中需引入spring-aspects
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.15.RELEASE</version>
</dependency>
- 使用aspectj的编译时aop方式启动声明式事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- transaction-manager缺省值transactionManager -- >
<tx:annotation-driven mode="aspectj" />
pom.xml文件
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.15.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
......
<!-- 在编译时,加入aop的编译 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.9</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<complianceLevel>1.8</complianceLevel>
<showWeaveInfo>true</showWeaveInfo>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
注解@Transactional的使用
- @Transactional 注解最好仅放在需要事务的函数上。如果放在class上,类的所有public函数上均会启用事务。
- 注解放在interface上对于cglib、aspects基本无效。需放在concrete class上(抽象类上也可以)。
- 当函数抛出RuntimeException型的异常才会回滚事务。当需要检测型异常也回滚事务时在注解rollbackFor
属性上指定
几种aop的事务间的区别
- cglib模式的aop事务。只有目标方法由外部调用,并且是public方法才生效
- aspects可以在非public和自调用上支持事务