作用:
在业务逻辑需要同时完成两项或者以上的数据库操作时(如转账,一方收入,一方支出,需要同时完成,不然会数据不同步),需要用到事务功能
实现:
1)添加需要用到的jar包或者maven依赖(书写在pom.xml,其中jdbc为java数据库连接需要的jar,aspects为织入事务的jar):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
2)在指定的xml配置文件中配置:
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 定义事务切面,并织入事务通知 -->
<aop:config>
<!-- 定义事务切面 -->
<aop:pointcut expression="execution(* com.accp.service..*(..))" id="servicePointcut"/>
<!-- 织入事务通知 -->
<aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice"/>
</aop:config>
a)这行代码设置了名字符合get*的方法为只读,即只能进行查询方法
<tx:method name="get*" read-only="true" />
b) 这行代码定义了事务切面为com.accp.service下所有包,即范围内的所有包遵循a处的规则
<aop:pointcut expression="execution(* com.accp.service..*(..))" id="servicePointcut"/>
c) 这行代码将b处的切面执行织入,事务生效
<aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice"/>