Java事务的类型有三种:

(1)JDBC事务:可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

(2)JTA(Java Transaction API)事务:事务可以跨越多个数据库或多个DAO,使用也比较复杂。

(3)容器事务:主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

Spring 实现JDBC声明式事务管理可以使用 Annotation 注解。使用注解实现可以减少代码之间的耦合度。

使用 Annotation 的方式非常简单,只需要在项目中做两件事,具体如下。

1)在 Spring 容器中注册驱动,代码如下所示:

<!-- 注册事务管理驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" />

或者使用注解

@Aspect
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven />
public class TransactionConfig {}

2)在需要使用事务的业务类或者方法中添加注解 @Transactional,并配置 @Transactional 的参数。关于 @Transactional 的参数如图所示。

常用属性说明如下:

  • propagation:设置事务的传播行为
  • isolation:设置事务的隔离级别
  • readOnly:设置是读写事务还是只读事务
  • timeout:事务超时事件(单位:s)

示例代码如下:

注:以下代码使用springboot

SQL:

INSERT INTO account (username,salary) VALUES ('Bob',3000);
INSERT INTO account (username,salary) VALUES ('Make',3000);

DAO层,在OrdersDao中注入jdbcTemplate,实现数据库操作:

@Repository
public class OrdersDao {// 注入jdbcTemplate模板对象@Autowiredprivate JdbcTemplate springJdbcTemplate;/*** Make减去1000*/public void reduceMoney() {String sql = "update account set salary=salary-? where username=?";springJdbcTemplate.update(sql, 1000, "Make");}/*** Bob增加1000*/public void addMoney() {String sql = "update account set salary=salary+? where username=?";springJdbcTemplate.update(sql, 1000, "Bob");}
}

Service层,OrdersService接口

public interface OrdersService {//转账操作void accountMoney();
}

具体实现,OrdersServiceImpl

@Service
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,rollbackFor = Exception.class,readOnly = false)
public class OrdersServiceImpl implements OrdersService{@Autowiredprivate OrdersDao ordersDao;// 调用dao的方法,业务逻辑,写转账业务public void accountMoney() {ordersDao.addMoney();// 2-加入出现异常如下面intint i=10/0; //银行中可能为突然停电等...// 3-Make减少1000ordersDao.reduceMoney();}
}

application.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springtemplate?useSSL=false
jdbc.username=root
jdbc.password=root

具体配置类,JdbcConfig 

@Configuration
public class JdbcConfig {@Value("${jdbc.driverClass}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;/*数据源*/@Bean("dataSource")public DriverManagerDataSource getDriverManagerDataSource(){DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(this.driver);dataSource.setUrl(this.url);dataSource.setUsername(this.username);dataSource.setPassword(this.password);return dataSource;}/*jdbc模板*/@Bean("springJdbcTemplate")public JdbcTemplate getJdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);//配置数据源return jdbcTemplate;}
}

具体配置类,TransactionConfig

@Aspect
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven />
public class TransactionConfig {/*** 配置事务管理器 注入连接池*/@Bean(name = "transactionManager")public DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

编写单元测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrdersServiceImplTest {@AutowiredOrdersService ordersService;@Testpublic void accountMoney() {ordersService.accountMoney();}
}

测试结果:

java.lang.ArithmeticException: / by zero

at com.swadian.spring_learn.service.OrdersServiceImpl.accountMoney(OrdersServiceImpl.java:36)
    at com.swadian.spring_learn.service.OrdersServiceImpl$$FastClassBySpringCGLIB$$4dccf147.invoke(<generated>)

因为出现了异常,所以事务实现了回滚,扣款和加钱操作均没有成功(防止了一方加钱成功另一方扣钱失败的情况),保持了数据的一致性。

Spring JDBC声明式事务管理相关推荐

  1. spring配置c3p0连接池、spring的声明式事务管理

    一.spring配置c3p0连接池: 1.导入maven依赖: <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> & ...

  2. Spring框架声明式事务管理

    Spring框架声明式事务管理 底层就是AOP原理,面向切面编程 在不修改源码的情况下,对方法进行增强 Spring框架事务管理相关类和API PlatformTransactionManager 平 ...

  3. Spring系列--声明式事务管理

    Spring事务管理概述 Spring的事务管理简化了传统的事务管理流程,并且在一定程序上减少了开发者的工作量. 事务管理的核心接口 在Spring的所有JAR包中包含一个名为Spring-tx-5. ...

  4. Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解

    声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念.Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spri ...

  5. Spring的声明式事务管理

    在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeExcep ...

  6. spring aop 声明式事务管理

    http://www.cnblogs.com/wangkaipeng/p/5782116.html

  7. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

  8. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  9. Spring Framework--Data Access(1)--Transaction Management(2) - 声明式事务管理

    一.概述 Spring的声明式事务管理是通过Spring的AOP实现的,Spring的事务管理和EJB CMT类似,都可以在方法级别上定义事务行为,不过他们两者也有区别,表现在: (1)EJB CMT ...

最新文章

  1. c# 如何将字符串中用,分开的数字分别存入数组中
  2. 手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级
  3. matlab宏参赛,MATLAB杯无人机大赛 | 决赛通知!
  4. LeetCode 860. 柠檬水找零(贪心)
  5. linux 脚本 语法错误,从windows拷贝到linux的脚本报错:未找到命令 or 语法错误
  6. Nginx(七):nginx原理解析
  7. linux修图,修图只知道Photoshop?11款高逼格修图工具快来get!
  8. Unsupported major.minor version (jdk版本错误)解决方案办法
  9. mtk协议与qc协议_通用充电器快充协议QC2.0,QC3.0,MTK PE,PE+,充电识别
  10. 74cms搭建 2021.03.13
  11. 神奇魔方html5游戏在线玩,神奇的魔方
  12. mysql 重做日志_mysql redo log 重做日志
  13. Linux7.5 安装mysql8.0.13教程
  14. 【阿里出品】数智园区白皮书(附下载)
  15. 一体的综合化云控平台
  16. css布局——GFC
  17. 日常工作中遇到的那些坑
  18. 校企合作案例【新文科背景下“三驾马车”与电子商务实验教学的深度融合】
  19. 快速幂算法c语言求a的n次方,快速幂算法(数学)
  20. MySQL一行变多行,多行变一行

热门文章

  1. Php socket 考勤机,php-socket
  2. 第3章 感受(一)——3.1. Hello world 经典版
  3. net12. 客户类——TcpClient
  4. java毕业设计普通中学体育卫生信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  5. python简单方便获取BDUSS
  6. 前端开发:JavaScript合并数组的方法
  7. Excel - IF 及IFERROR 判断逻辑
  8. kali linux手机运行,使用Kali Linux入侵Android手机
  9. (一)C#调用一言API并提取关键字
  10. python 模块保存在哪_python模块存储在哪里?