日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作

發布時間:2025/3/17 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文源碼 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base

一、事務管理簡介

1、事務基本概念
一組業務操作ABCD,要么全部成功,要么全部不成功。
2、特性:ACID
原子性:整體
一致性:完成
隔離性:并發
持久性:結果
3、隔離問題
臟讀:一個事務讀到另一個事務沒有提交的數據
不可重復讀:一個事務讀到另一個事務已提交的數據(update)
虛讀(幻讀):一個事務讀到另一個事務已提交的數據(insert)
4、隔離級別
read uncommitted:讀未提交。
read committed:讀已提交。解決臟讀。
repeatable read:可重復讀。解決:臟讀、不可重復讀。
serializable :串行化。都解決,單事務。

二、Spring管理事務

1、頂級接口


1)PlatformTransactionManager
平臺事務管理器,spring要管理事務,必須使用事務管理器進行事務配置時,必須配置事務管理器。
2)TransactionDefinition
事務詳情(事務定義、事務屬性),spring用于確定事務具體詳情,
例如:隔離級別、是否只讀、超時時間 等
進行事務配置時,必須配置詳情。spring將配置項封裝到該對象實例。
3)TransactionStatus
事務狀態,spring用于記錄當前事務運行狀態。例如:是否有保存點,事務是否完成。
spring底層根據狀態進行相應操作。

2、事務狀態

3、事務定義

PROPAGATION_REQUIRED , required , 必須 【默認值】支持當前事務,A如果有事務,B將使用該事務。如果A沒有事務,B將創建一個新的事務。 PROPAGATION_SUPPORTS ,supports ,支持支持當前事務,A如果有事務,B將使用該事務。如果A沒有事務,B將以非事務執行。 PROPAGATION_MANDATORY,mandatory ,強制支持當前事務,A如果有事務,B將使用該事務。如果A沒有事務,B將拋異常。 PROPAGATION_REQUIRES_NEW , requires_new ,必須新的如果A有事務,將A的事務掛起,B創建一個新的事務如果A沒有事務,B創建一個新的事務 PROPAGATION_NOT_SUPPORTED ,not_supported ,不支持如果A有事務,將A的事務掛起,B將以非事務執行如果A沒有事務,B將以非事務執行 PROPAGATION_NEVER ,never,從不如果A有事務,B將拋異常如果A沒有事務,B將以非事務執行 PROPAGATION_NESTED ,nested ,嵌套A和B底層采用保存點機制,形成嵌套事務。 掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED

三、SpringBoot2.0管理事務

基于轉賬的案例演示,基于druid連接池配置。druid連接池在文章。

SpringBoot2.0 基礎案例(07):集成Druid連接池,配置監控界面

1、新建轉賬表

CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50),money INT )ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO account(username,money) VALUES('jack','10000'); INSERT INTO account(username,money) VALUES('rose','10000'); SELECT * FROM account;

2、基于事務手動管理器

該配置用于測試事務的手動管理。

/*** 事物管理器*/ @Bean(name = "transactionManager") public PlatformTransactionManager transactionManager (DruidDataSource dataSource){LOGGER.info("【transactionManager 初始化...】");DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager; } /*** 創建事物手動管理模板*/ @Bean(name = "transactionTemplate") public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager)LOGGER.info("【transactionTemplate 初始化...】");TransactionTemplate transactionTemplate = new TransactionTemplate() ;transactionTemplate.setTransactionManager(transactionManager);return transactionTemplate; }

3、封裝轉賬接口

接口方法

public interface AccountService {/*** 匯款*/void out (String outer , Integer money);/*** 收款*/void in (String inner , Integer money); }

接口實現

@Service public class AccountServiceImpl implements AccountService {@Resourceprivate JdbcTemplate jdbcTemplate ;public void out(String outer, Integer money) {String sql = "update account set money = money - ? where username = ?";jdbcTemplate.update(sql, money,outer);}public void in(String inner, Integer money) {String sql = "update account set money = money + ? where username = ?";jdbcTemplate.update(sql, money,inner);} }

4、封裝三個測試接口

測試接口

public interface TradeService {/*** 轉賬交易:沒有事務管理*/void trade1(String outer ,String inner ,Integer money);/*** 轉賬交易:手動管理事務*/void trade2(String outer ,String inner ,Integer money);/*** 轉賬交易:注解管理事務*/void trade3(String outer ,String inner ,Integer money); }

接口實現

@Service public class TradeServiceImpl implements TradeService {@Resourceprivate AccountService accountService ;@Resourceprivate TransactionTemplate transactionTemplate ;@Overridepublic void trade1(String outer, String inner, Integer money) {accountService.out(outer, money);// 拋出異常int i = 1/0;accountService.in(inner, money);}@Overridepublic void trade2(String outer, String inner, Integer money) {transactionTemplate.execute(new TransactionCallbackWithoutResult() {public void doInTransactionWithoutResult(TransactionStatus arg0) {accountService.out(outer, money);// 拋出異常int i = 1/0;accountService.in(inner, money);}});}@Transactional(value="transactionManager",propagation= Propagation.REQUIRED)@Overridepublic void trade3(String outer, String inner, Integer money) {accountService.out(outer, money);// 拋出異常int i = 1/0;accountService.in(inner, money);} }

5、編寫測試類

@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = TransactionApplication.class) public class TradeTest {@Resourceprivate TradeService tradeService ;/*** 沒有事務管理* jack 減少了1000塊錢,但是rose得到1000塊錢* 1 jack 9000* 2 rose 10000*/@Testpublic void testTrade1 (){tradeService.trade1("jack", "rose", 1000);}/*** 手動管理事務* 1 jack 10000* 2 rose 10000*/@Testpublic void testTrade2 (){tradeService.trade2("jack", "rose", 1000);}/*** 注解管理事務* 1 jack 10000* 2 rose 10000*/@Testpublic void testTrade3 (){tradeService.trade3("jack", "rose", 1000);} }

四、源代碼地址

GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 碼云地址:知了一笑 https://gitee.com/cicadasmile/spring-boot-base


總結

以上是生活随笔為你收集整理的SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。