1、声明式事务(注解)

1.1、@Transactional

  • 名称:@Transactional

  • 类型:方法注解,类注解,接口注解

  • 位置:方法定义上方,类定义上方,接口定义上方

  • 作用:设置当前类/接口中所有方法或具体方法开启事务,并指定相关事务属性

  • 范例:

    @Transactional(
        readOnly = false,
        timeout = -1,
        isolation = Isolation.DEFAULT,
        rollbackFor = {ArithmeticException.class, IOException.class},
        noRollbackFor = {},
        propagation = Propagation.REQUIRES_NEW
    )

1.2、tx:annotation-driven

  • 名称:tx:annotation-driven

  • 类型:标签

  • 归属:beans标签

  • 作用:开启事务注解驱动,并指定对应的事务管理器

  • 范例:

    <tx:annotation-driven transaction-manager="txManager"/>

2、声明式事务(纯注解方式)

  • 名称:@EnableTransactionManagement

  • 类型:类注解

  • 位置:Spring注解配置类上方

  • 作用:开启注解驱动,等同XML格式中的注解驱动

  • 范例:

    @Configuration
    @ComponentScan("com.itheima")
    @PropertySource("classpath:jdbc.properties")
    @Import({JDBCConfig.class,MyBatisConfig.class,TransactionManagerConfig.class})
    @EnableTransactionManagement
    public class SpringConfig {
    }

    public class TransactionManagerConfig {
        @Bean
        public PlatformTransactionManager getTransactionManager(@Autowired DataSource dataSource){
            return new DataSourceTransactionManager(dataSource);
        }
    }

 注意:

        纯注解方式实现事务管理,事务管理所用的注解类只有[@Transactional  @EnableTransactionManagement]这两个。

3、纯注解方式案例演示

3.1、项目结构

3.2、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>com.itheima</groupId><artifactId>Spring_day04_04_声明式事务_注解驱动</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.9.RELEASE</version></dependency></dependencies>
</project>

3.3、jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=itheima

3.4、JDBCConfig

package com.itheima.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;public class JDBCConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String userName;@Value("${jdbc.password}")private String password;@Bean("dataSource")public DataSource getDataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}@Beanpublic PlatformTransactionManager getTransactionManager(DataSource dataSource){return new DataSourceTransactionManager(dataSource);}}

3.5、MybatisConfig

package com.itheima.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {@Beanpublic SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage("com.itheima.domain");ssfb.setDataSource(dataSource);return ssfb;}@Beanpublic MapperScannerConfigurer getMapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.itheima.dao");return msc;}}

3.6、SpringConfig

package com.itheima.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
@Import({JDBCConfig.class,MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

3.7、AccountDao

package com.itheima.dao;import com.itheima.domain.Account;
import org.apache.ibatis.annotations.*;
import org.mybatis.spring.SqlSessionFactoryBean;import java.util.List;public interface AccountDao {@Update("update account set money = money + #{money} where name = #{name}")void inMoney(@Param("name") String name, @Param("money") Double money);@Update("update account set money = money - #{money} where name = #{name}")void outMoney(@Param("name") String name, @Param("money") Double money);}

3.8、Account

package com.itheima.domain;import java.io.Serializable;public class Account implements Serializable {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}

3.9、AccountService

package com.itheima.service;import com.itheima.domain.Account;
import org.springframework.transaction.annotation.Transactional;import java.util.List;
public interface AccountService {@Transactionalpublic void transfer(String outName, String inName, Double money);}

3.10、AccountServiceImpl

package com.itheima.service.impl;import com.itheima.dao.AccountDao;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;public void transfer(String outName, String inName, Double money) {accountDao.inMoney(outName,money);int i = 1/0;accountDao.outMoney(inName,money);}
}

3.11、测试案例UserServiceTest代码

package com.itheima.service;import com.itheima.config.SpringConfig;
import com.itheima.domain.Account;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;//设定spring专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//设定加载的spring上下文对应的配置
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {@Autowiredprivate AccountService accountService;@Testpublic void testTransfer(){accountService.transfer("Jock1","Jock2",100D);}}

声明式事务(注解与纯注解方式)相关推荐

  1. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

  2. Spring→事务、隔离级别、事务传播行为、编程式事务控制、XML配置声明式事务(原始方式)、XML配置声明式事务(基于tx/aop)、@注解配置声明式事务、优势总结

    事务 Spring事务管理 不考虑隔离引发问题 隔离级别 事务传播行为 演示环境搭建 编程式事务控制 XML配置声明式事务(原始方式) XML配置声明式事务(基于tx/aop) @注解配置声明式事务 ...

  3. Spring JDBC-使用注解配置声明式事务

    系列 概述 使用Transactional注解 txannotation-driven其他属性 关于Transaction的属性 在何处标注Transactional注解 在方法处使用注解 使用不同的 ...

  4. 事务(注解声明式事务管理)

    1.什么事务 (1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 2.事务四个特性(ACID) (1)原子性 (2)一致性 (3)隔离性 (4)持久性 1.原子 ...

  5. Spring的编程式事务声明式事务 基于注解的声明式事务控制

    文章目录 Spring中编程式事务 基于XML的声明式事务控制 基于注解的声明式事务控制 Spring集成web环境 Spring中编程式事务 Spring的事务控制可以分为编程式事务控制和声明式事务 ...

  6. 声明式事务、SpringMVC详解

    声明式事务   开发者采用配置的方式来实现事务的控制,业务代码和事务代码实现解耦合,使用的就是上一篇的AOP思想.   都需要定义一个事务管理器,都需要导入spring-aop和aspectjweav ...

  7. 【SSM框架系列】Spring - JdbcTemplate声明式事务

    JdbcTemplate概述 以往使用jdbc时,每次都需要自己获取PreparedStatement,执行sql语句,关闭连接等操作.操作麻烦冗余,影响编码的效率. Spring把对数据库的操作在j ...

  8. Spring JDBC-使用XML配置声明式事务

    系列 概述 基于aop/tx命名空间的配置 示例 tx:method元素属性 系列 Spring对事务管理的支持概述以及 编程式的事务管理 Spring JDBC-使用XML配置声明式事务 Sprin ...

  9. (续)SSM整合之spring笔记(声明式事务)(P110-116)

    目录 一 .声明式事务概念 二 .基于注解的声明式事务 1 .准备工作 (1)加入依赖 (2)创建jdbc.properties (3)配置Spring的配置文件     tx-annotation. ...

  10. SpringBoot24-spingboot数据访问-声明式事务

    一,spring事务的机制 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务,提交事务来完成数据操作,或者在发生错误的时候回滚数据. 而spring的事务机制是用统一的机制来处理不 ...

最新文章

  1. [YTU]_1055 (输入字符串以及输出)
  2. 成功解决SyntaxError: import * only allowed at module level
  3. lottie插件_RN常用插件集
  4. JAVA Unsafe类
  5. 量子计算机网络指数时间,科普:量子计算机是这样计算的
  6. 虚函数,虚基类 与纯虚函数 二
  7. Notepad++ 配合TCC直接编译运行C代码
  8. php文本框显示ip,php实现图形显示Ip地址的代码及注释_PHP教程
  9. android连接程序,android程序如何连接真机进行测试
  10. mysql学生管理系统背景_MySql学习之路1 背景介绍
  11. python数据结构-单链表
  12. 电信4区服务器未响应进网通六区,7月16日电信六区,网通经典区合服公告
  13. 达梦数据库(简称DM)的初级教程分享
  14. DCDC电源中同步与异步的区别
  15. 为什么要用同花顺程序化交易接口
  16. macOS Big Sur 11.7.1 (20G918) 正式版 ISO、PKG、DMG、IPSW 下载
  17. uni-app h5打包发版到测试和生产环境具体步骤
  18. 这就是iPhone 6的屏幕?
  19. css3 实现图片闪过一道光效果 亲测可用
  20. Visual Studio 2017, 2019 官网下载地址

热门文章

  1. AEJoy —— 表达式之速度和频率控制(七)【JS】
  2. ideaIU-2020.1.1最终版下载安装全解
  3. 台式电脑开机后显示器无信号并黑屏
  4. 淼泉卫生院能耗管理系统,通过对能源的采集并管理降低能耗。
  5. 软件工程知识点汇总(期末总复习)
  6. VS2019项目打包exe文件教程
  7. vant改定制颜色 修改tab标签和滚动条颜色
  8. C语言 getline函数实现
  9. 低仿饿了么H5-纯前端Vue版 + 手把手教学
  10. JavaScript获取节点