Spring 事务控制 -- 基于注解的声明式事务控制
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 事务控制 -- 基于注解的声明式事务控制相关的知识,希望对你有一定的参考价值。
01:Spring 事务控制 – 编程式事务控制相关对象
02:Spring 事务控制 – 基于XML的声明式事务控制:环境搭建
03:Spring 事务控制 – 基于XML的声明式事务控制:详细配置
04:Spring 事务控制 – 基于注解的声明式事务控制
1. 基于注解的声明式事务控制
在此之前,你应该先把环境搭建好。
02:Spring 事务控制 – 基于XML的声明式事务控制:环境搭建
1.1 修改applicationContext.xml配置文件
一般来说,自己写的类通过注解的方式交给Spring IoC管理。非自定义的类通过配置文件的方式进行配置。
applicationContext.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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--组件扫描-->
<context:component-scan base-package="com.tian"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="317525"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置平台事务管理器: -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--事物的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
1.2 托管IoC
1.3 注解配置事务
package com.tian.service.impl;
import com.tian.dao.AccountDao;
import com.tian.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service("accountService")
// 该注解里面配置事务的属性信息:隔离级别、传播行为、超时时间、是否只读
// 如果在类上面配置了信息:那么这个事务的属性消息对于下面的方法是通用的
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, timeout = 2, readOnly = true)
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
// 方法上配置事务的属性信息会覆盖类上面配的信息
@Transactional(isolation = Isolation.REPEATABLE_READ, timeout = 3, readOnly = false)
public void transfer(String outMan, String inMan, double money) {
// 这里应该开启事务
accountDao.out(outMan, money);
int i = 1 / 0;
accountDao.in(inMan, money);
// 这里应该提交事务
}
}
运行结果:
我们先把accout表的金额都设置为5000
测试:手动制造异常
运行controller方法:
运行结果:
1.4 基于注解的声明式事务控制要点
以上是关于Spring 事务控制 -- 基于注解的声明式事务控制的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制