😀前言
本篇是Spring 声明式事务系列的最后一篇介绍了Spring事务的隔离级别介绍说明
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
🥰事务的隔离级别
😍事务隔离级别说明
● 事务隔离级别的概念在这篇博客
● 事务隔离级别说明
- 默认的隔离级别, 就是 mysql 数据库默认的隔离级别 一般为 REPEATABLE_READ
- 看源码可知 Isolation.DEFAULT 是 :Use the default isolation level of the underlying datastore
- 查看数据库默认的隔离级别 SELECT @@global.tx_isolation
😊事务隔离级别的设置和测试
- 修改 GoodsService.java , 先测默认隔离级别,增加方法 buyGoodsByTxISOLATIO
测试事务的隔离级别
- 默认的隔离级别, 就是 mysql 数据库默认的隔离级别 一般为 REPEATABLE_READ
- 看源码可知 Use the default isolation level of the underlying datastore
public enum Isolation {
< p>
Use the default isolation level of the underlying datastore.
All other levels correspond to the JDBC isolation levels.
@see java.sql.Connection
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT)}
- 查看数据库默认的隔离级别 SELECT @@global.tx_isolation
@Transactional(propagation = Propagation.REQUIRES_NEW) public void buyGoodsByTxISOLATION(int user_id, int goods_id, int num) { //查询到商品价格 Float goods_price = goodsDao.queryPriceById(goods_id); System.out.println("第一次读取的价格 = " + goods_price); //测试一下隔离级别,在同一个事务中,查询一下价格 goods_price = goodsDao.queryPriceById(goods_id); System.out.println("第二次读取的价格 = " + goods_price); }
完成测试
修改TxTest增 加测试方法, 默认隔离级别下, 两次读取到的价格是一样的,不会受到 SQLyog 修改影响
@Test public void buyGoodsByTxISOLATIONTest() { ApplicationContext ioc = new ClassPathXmlApplicationContext("tx_ioc.xml"); GoodsService bean = ioc.getBean(GoodsService.class); bean.buyGoodsByTxISOLATION(1, 1, 1); System.out.println("------ok--------"); }
修改 GoodsService.java , 测试 READ_COMMITTED 隔离级别情况
完成测试
使用前面已经创建好的测试方法, 在 READ_COMMITTED 隔离级别 下, 两次 读取到的价格会受到 SQLyog 修改
@Test public void buyGoodsByTxISOLATIONTest() { ApplicationContext ioc = new ClassPathXmlApplicationContext("tx_ioc.xml"); GoodsService bean = ioc.getBean(GoodsService.class); bean.buyGoodsByTxISOLATION(1, 1, 1); System.out.println("------ok--------"); }
😋事务的超时回滚
● 基本介绍
- 如果一个事务执行的时间超过某个时间限制,就让该事务回滚。
- 可以通过设置事务超时回顾来实现
● 基本语法
超时回滚-代码实现
修改 GoodsService.java ,增加 buyGoodsByTxTimeout()
@Transactional(timeout = 2) public void buyGoodsByTxTimeout(int user_id, int goods_id, int num) { //查询到商品价格 Float goods_price = goodsDao.queryPriceById02(goods_id); //购买商品,减去余额 goodsDao.updateBalance02(user_id, goods_price * num); System.out.println("====超时 start===="); try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("====超时 end===="); //更新库存 goodsDao.updateAmount02(goods_id, num); }
测试 TxTest.java, 增加测试方法
@Test public void buyGoodsByTxTimeoutTest() { ApplicationContext ioc = new ClassPathXmlApplicationContext("tx_ioc.xml"); GoodsService bean = ioc.getBean(GoodsService.class); bean.buyGoodsByTxTimeout(1, 1, 1); System.out.println("------ok--------"); }
注意
上面所有的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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--配置要扫描的包--> <context:component-scan base-package="com.spring.tx.dao"/> <context:component-scan base-package="com.spring.tx.service"/> <!--引入外部的jdbc.properties文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置数据源对象-DataSoruce--> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource"> <!--给数据源对象配置属性值--> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.pwd}"/> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> </bean> <!--配置JdbcTemplate对象--> <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"> <!--给JdbcTemplate对象配置dataSource--> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务管理器-对象 1. DataSourceTransactionManager 这个对象是进行事务管理-debug源码 2. 一定要配置数据源属性,这样指定该事务管理器 是对哪个数据源进行事务控制 --> <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置启动基于注解的声明式事务管理功能--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
😄总结
- mysql 数据库默认的隔离级别 一般为 REPEATABLE_READ
- 查看数据库默认的隔离级别 SELECT @@global.tx_isolation
配置启动基于注解的声明式事务管理功能为
< t x:annotation-driven transaction-manager=“transactionManager”/>
Spring 声明式事务系类文章
第一篇-> 什么是Spring 声明式事务详细讲解_尘觉的博客-CSDN博客
第二篇->Spring 声明式事务机制_尘觉的博客-CSDN博客
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞