开启事物控制管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
配置事务通知
1.配置哪些函数委托spring进行事务管理。
2.事务的隔离级别(isolation默认:DEFAULT)
3。传播行为(propagation:REQUIREO)
4.是否是只读或读写事务(read-only:true只读false读写)
5.transaction-manager配置使用哪个事务控制管理器
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<!-- name决定是哪种规则的的方法上添加事务
如果是xxx*表示方法名以xxx开头的方法会被选取-->
<tx:method name="insert*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="borrow*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="select*" read-only="true"/>
</tx:attributes>
</tx:advice>
配置事务的切入点
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.dltt.money.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="txPointcut"/>
</aop:config>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql2209?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
配置jdbcTemplate组件
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
案例演示:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring_08_tx</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.21.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.bundles</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8_2</version>
</dependency>
</dependencies>
<
app.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.dltt"/>
<!-- 1.开启事物控制管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务通知-->
<!--
1.配置哪些函数委托spring进行事务管理
2.事务的隔离级别(isolation默认:DEFAULT),
3.传播行为(propagation:REQUIREO),
4.是否是只读或读写事务(read-only:true只读false读写)
5.transaction-manager配置使用哪个事务控制管理器
name管的是方法的开头
-->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<!-- name决定是哪种规则的的方法上添加事务
如果是xxx*表示方法名以xxx开头的方法会被选取-->
<tx:method name="insert*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="borrow*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="select*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务的切入点-->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.dltt.money.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="txPointcut"/>
</aop:config>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql2209?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置jdbcTemplate组件-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
java
package com.dltt.money.dao;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
@Repository
public class ImplUserDao implements UserDao {
@Resource
private JdbcTemplate JdbcTemplate;
@Override
public void reduceMoney() {
String sql="update user2 set user_money=user_money-? where user_name=?";
Object[] args={500,"小红"};
JdbcTemplate.update(sql,args);
}
@Override
public void addMoney() {
String sql="update user2 set user_money=user_money+? where user_name=?";
Object[] args={500,"小明"};
JdbcTemplate.update(sql,args);
}
}
package com.dltt.money.service;
import com.dltt.money.dao.UserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class Uservice {
@Resource(name="implUserDao")
private UserDao userDao;
//借钱业务
public void borrowMoney(){
// 开启事物
// try {
// 进行事物操作
userDao.addMoney();
// 设置异常
// int i=10/0;
userDao.reduceMoney();
// 没发现异常,提交
// } catch (Exception e) {
// 出现异常回滚
// e.printStackTrace();
// }
}
}