1.编程式事务控制相关对象
-
PlatformTransactionManager
-
TransactionDefinition
-
TransactionStatus
2.基于XML的声明式事务控制
spring的声明事务控制底层就是AOP
AOP就是一种功能比较复杂的拦截器。在代码真正到达目标以前,AOP可以对其进行拦截,提供一些通用的中间件的服务。如加上事务服务,记录日志等。
1)文件夹格式:
2)基本方法操作
pom.xml引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
创建数据库表
Account创建实体对象:
applicationContext.xml下配置jdbc模板:
<!--数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--jdbc模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
AccountDaoImpl:
AccountServiceImpl:
applicationContext.xml下Bean依赖注入:
AccountController:
3)事务控制
3.1引入事务控制原因:
转账异常情况:AccountServiceImpl下
运行结果:
一方钱减少,一方未增加,故需引入事务,利用事务的原子性操作,实现转账。
3.2声明式事务控制的实现
切点方法的事务参数的配置:
aop:advisor只有一个增强
配置文件applicationContxt.xml
<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--通知 事务的增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--配置事务的aop织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.*.*(..))"/>
</aop:config>
运行结果,失败事务回滚,数据库内容不变
3.基于注解式的声明事务控制
1)applicationContxt.xml删除自定义
添加注解:
applicationContxt.xml添加组件扫描
2)applicationContxt.xml删除事务增强和织入:
添加注解:
3)事务注解驱动
<tx:annotation-driven transaction-manager="transactionManager"/>
配置文件: