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 事务控制 -- 基于注解的声明式事务控制的主要内容,如果未能解决你的问题,请参考以下文章

spring基于注解的声明式事务控制

Spring基于纯注解的声明式事务控制

阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

Spring 事务控制 -- 基于XML的声明式事务控制:环境搭建

spring基于注解的声明式事务控制配置

Spring 事务控制 -- 基于XML的声明式事务控制:详细配置