精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 多數據源如何處理事務?教你一招!

開發 架構
在微服務中,一個服務實際上就代表了一個數據源,而在我們多數據源的案例中,一個注解就能標記出來一個數據源,這樣一類比,你就會發現利用分布式事務來解決多數據源中的事務問題其實是非常 Easy 的。而且這里還不是微服務項目,只是一個單體項目,更簡單!

首先我先聲明一點,本文單純就是技術探討,要從實際應用中來說的話,我并不建議這樣去玩分布式事務、也不建議這樣去玩多數據源,畢竟分布式事務主要還是用在微服務場景下。

好啦,那就不廢話了,開整。

1. 思路梳理

首先我們來梳理一下思路。

在上篇文章中,我們是一個微服務,在 A 中分別去調用 B 和 C,當 B 或者 C 有一個執行失敗的時候,就去回滾。B 和 C 都是調用遠程的服務,所謂的回滾也不是傳統意義上的數據庫回滾,而是一種“反向補償”,即利用一條更新 SQL,將已經更新的數據復原。在這個例子中,B 和 C 都是遠程服務,操作的也都是不同的數據庫,這不就是我們多數據源中的情況么!

在微服務中,一個服務實際上就代表了一個數據源,而在我們多數據源的案例中,一個注解就能標記出來一個數據源,這樣一類比,你就會發現利用分布式事務來解決多數據源中的事務問題其實是非常 Easy 的。而且這里還不是微服務項目,只是一個單體項目,更簡單!

不過也有一些需要注意的細節。

2. 代碼實踐

接下來我們就結合代碼來講講。

2.1 案例準備

首先多數據源的案例我就不重復寫了,我們之前已經寫過一個,這里就不再贅述,文章一開頭也有相關的鏈接,還沒看過的小伙伴可以先看看。

也可以直接在公眾號后臺回復 dynamic_datasource 獲取相關的案例。

2.2 開始整活

因為上篇文章我主要是和大家分享的 seata 的 AT 模式,所以本文也是一樣,就先采用 AT 模式。

小伙伴們知道,在我們的多數據源案例中,我們用到了兩個庫,test08 和 test09,現在也還是這兩個庫,但是現在由于我們使用的是 AT 模式,我們需要在這兩個庫中分別創建 undo log 表,用來記錄我們對表的更新操作,當事務提交之后,undo log 表中的數據就會被清除,undo log,undo log 表的腳本如下:

CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

數據庫準備好之后,接下來就是準備依賴了,seata 有兩個依賴,一個是 seata-all,還有一個微服務版的,咱們這里就直接使用上篇文章中所用到的微服務版的,依賴如下:

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>

配好之后,接下來提供兩個配置文件 file.conf 和 regsigry.conf,這兩個配置文件和上篇文章中介紹到的一模一樣,這里不再贅述。

接下來配置 application.yaml,如下:

spring:
cloud:
alibaba:
seata:
tx-service-group: my_test_tx_group
main:
allow-circular-references: true
seata:
enable-auto-data-source-proxy: false
application-id: dd

大家看下這里的幾個配置:

  • tx-service-group:這個是事務群組的名稱,相關名字是在 file.conf 中配置的。
  • allow-circular-references:這個是允許循環依賴,可能有的小伙伴已經知道,現在最新版的 Spring Boot 中已經禁掉了循環依賴,但是這個 seata 中似乎還是用到了循環依賴,所以要開啟。
  • enable-auto-data-source-proxy:由于 seata 會自動代理數據源,但是我們現在的數據源是自己加載的,所以關閉掉這個數據源的自動代理,將來用自己的。
  • application-id:給我們的應用取一個名字。

好啦,這個文件就配置好了。

接下來就是數據源問題了,剛剛說了,seata 中會自動代理數據源,用到的代理對象是 DataSourceProxy,而我們在之前自定義的數據源加載中,并沒有用到這個 DataSourceProxy 對象所以這里要稍作修改,一共改兩個地方,如下:

LoadDataSource.java

@Component
@EnableConfigurationProperties(DruidProperties.class)
public class LoadDataSource {
@Autowired
DruidProperties druidProperties;

public Map<String, DataSourceProxy> loadAllDataSource() {
Map<String, DataSourceProxy> map = new HashMap<>();
Map<String, Map<String, String>> ds = druidProperties.getDs();
try {
Set<String> keySet = ds.keySet();
for (String key : keySet) {
DataSource dataSource = druidProperties.dataSource((DruidDataSource) DruidDataSourceFactory.createDataSource(ds.get(key)));
DataSourceProxy proxyDs = new DataSourceProxy(dataSource);
map.put(key, proxyDs);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}

其實這里的改動就是把之前的 DataSource 用 DataSourceProxy 重新包裹一下,然后將獲取到的 DataSourceProxy 存起來。最后再修改一下動態數據源的地方:

@Component
public class DynamicDataSource extends AbstractRoutingDataSource {

public DynamicDataSource(LoadDataSource loadDataSource) {
//1.設置所有的數據源
Map<String, DataSourceProxy> allDs = loadDataSource.loadAllDataSource();
super.setTargetDataSources(new HashMap<>(allDs));
//2.設置默認的數據源
//將來,并不是所有的方法上都有 @DataSource 注解,對于那些沒有 @DataSource 注解的方法,該使用哪個數據源?
super.setDefaultTargetDataSource(allDs.get(DataSourceType.DEFAULT_DS_NAME));
//3
super.afterPropertiesSet();
}

/**
* 這個方法用來返回數據源名稱,當系統需要獲取數據源的時候,會自動調用該方法獲取數據源的名稱
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceType();
}
}

Map 中的 value 類型變為 DataSourceProxy,其他都不變。

另外還有一個地方要改造下,就是解析 @DataSource 注解的切面,在之前的解析中,我們是將異常捕獲了,現在我們要將之拋出來,如下:

@Around("pc()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//獲取方法上面的有效注解
DataSource dataSource = getDataSource(pjp);
if (dataSource != null) {
//獲取注解中數據源的名稱
String value = dataSource.value();
DynamicDataSourceContextHolder.setDataSourceType(value);
}
try {
return pjp.proceed();
} finally {
DynamicDataSourceContextHolder.clearDataSourceType();
}
}

將之拋出來的原因也很簡單,因為這是切面方法,所有的 service 層方法都在這里執行,如果將異常捕獲了,將來 service 層方法不拋出異常,事務就沒法生效了。

好了,現在準備工作就算是到位了。

接下來我們寫一個簡單的多數據源事務的案例,首先我們來創建一個 MasterService,專門用來操作 master 數據源:

@Service
public class MasterService {

@Autowired
MasterMapper masterMapper;

@DataSource("master")
public void addUser(String username, Integer age) {
masterMapper.addUser(username, age);
}
}

mapper 就不用看了吧,就是普通的添加,大家可以在文末下載本文案例案例。

再來一個 SlaveService,用來操作 slave 數據源:

@Service
public class SlaveService {

@Autowired
SlaveMapper slaveMapper;

@DataSource("slave")
public void addAccount(String name, Double balance) {
int i = 1 / 0;
slaveMapper.addAccount(name, balance);
}
}

slave 數據源的方法中有一個異常。

最后,我們在 UserService 中分別調用這兩個方法:

@Service
public class UserService {

@Autowired
MasterService masterService;
@Autowired
SlaveService slaveService;

@GlobalTransactional(rollbackFor = Exception.class)
public void test() {
masterService.addUser("javaboy.org", 99);
slaveService.addAccount("javaboy.org", 99.0);
}
}

注意,test 方法上有一個全局事務注解。

好啦,齊活!現在我們去執行這個 test 方法,由于 slaveService#addAccount 中的方法會拋出異常,所以會導致整個事務回滾,最終的結果就是 master 中也沒有添加進數據。

3. 總結

好啦,結合上一篇文章,相信大家應該能夠熟練的使用 seata 分布式事務中的 at 模式了吧!

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2020-12-31 07:55:33

spring bootMybatis數據庫

2022-05-18 12:04:19

Mybatis數據源Spring

2020-11-24 09:56:12

數據源讀寫分離

2023-10-18 15:25:29

數據源數據庫

2010-01-28 09:52:18

PostgreSQL客

2012-02-01 15:41:42

2017-07-21 14:50:15

數據庫DB分庫事務處理

2022-05-10 10:43:35

數據源動態切換Spring

2009-08-14 10:26:27

ibatis多數據源

2024-10-30 10:22:17

2022-09-06 11:53:00

開發計算

2021-06-28 20:01:07

電腦性能Windows 7

2022-04-27 08:55:01

Spring外部化配置

2023-09-07 08:39:39

copy屬性數據源

2023-09-19 22:41:30

控制器HTTP

2020-09-16 06:08:10

Linux文本比對代碼

2020-06-22 14:18:02

運維架構技術

2011-05-03 11:13:51

黑盒

2023-06-07 08:08:37

MybatisSpringBoot

2022-06-21 09:27:01

PythonFlaskREST API
點贊
收藏

51CTO技術棧公眾號

国产一级片免费观看| 午夜国产福利在线观看| 国产福利免费在线观看| 精品一区二区三区在线观看| 欧美激情中文网| 波多野结衣一本| 国产日韩在线观看视频| 激情成人在线视频| 先锋影音男人资源| 欧美一区二区少妇| 国产激情视频一区二区在线观看| 欧美自拍大量在线观看| 精品国产视频在线观看| 伊人久久大香线蕉av不卡| 3751色影院一区二区三区| 精品一区二区中文字幕| 污视频免费在线观看| 欧美激情资源网| 精品高清视频| 国产富婆一级全黄大片| 青青草视频一区| 2019最新中文字幕| 久久久一二三区| 婷婷综合社区| 在线不卡国产精品| 国产色视频一区二区三区qq号| 在线视频成人| 欧美视频一区在线| 国产成人精品无码播放| www.超碰在线| 亚洲一区在线观看免费观看电影高清| 亚洲精品成人a8198a| 日本在线视频1区| 懂色av中文字幕一区二区三区| 91精品国产综合久久香蕉的用户体验| 激情五月婷婷网| 在线亚洲自拍| 91国产美女在线观看| 玖玖爱免费视频| 一区二区在线影院| 久久人体大胆视频| 波多野结衣欲乱| 91麻豆精品国产91久久久平台| 亚洲性无码av在线| 日本欧美一区二区三区不卡视频| 台湾佬综合网| 亚洲深夜福利在线| 男人操女人动态图| 精品国产aⅴ| 一本色道久久88亚洲综合88| 国产综合精品在线| 精品日本12videosex| 在线日韩精品视频| jizz18女人高潮| 凹凸成人精品亚洲精品密奴| 在线视频亚洲欧美| 亚洲欧美卡通动漫| 外国成人激情视频| 欧美激情一区二区三区在线视频观看| 青青草激情视频| 黄色亚洲在线| 欧美在线免费看| 波多野结衣电影在线播放| 日韩在线a电影| 国产精品一区二区三区久久久| 中文字幕人妻一区二区在线视频| 麻豆精品视频在线观看| 成人免费xxxxx在线观看| hs视频在线观看| 成a人片国产精品| 欧美日韩精品综合| 在线免费观看黄| 亚洲卡通动漫在线| 欧美黑人经典片免费观看| 伊人久久视频| 欧美日韩二区三区| 黄色av电影网站| 亚洲人亚洲人色久| 色七七影院综合| 麻豆国产尤物av尤物在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 2021国产精品视频| 国产又粗又长又黄| 成人免费视频一区二区| 欧美一区二区视频17c| 色哟哟免费在线观看 | 欧美日韩精品免费观看视一区二区| 国产最新视频在线| 亚洲精品高清在线| 青青在线视频免费| 欧一区二区三区| 亚洲免费视频在线观看| 成人免费精品动漫网站| 一区二区激情| 亚洲一区亚洲二区亚洲三区| 日韩精品一二| 亚洲精品videosex极品| 欧美激情国产精品日韩| 久久伊人影院| 国产亚洲在线播放| 久久久久久国产精品视频| 日韩精品乱码免费| 懂色中文一区二区三区在线视频| 黄色在线视频观看网站| 亚洲最大的成人av| 日韩av手机版| 日本亚洲不卡| 久久99国产综合精品女同| 无码任你躁久久久久久久| 高清日韩电视剧大全免费| 日韩动漫在线观看| 三级中文字幕在线观看| 日韩精品中文字幕一区| xxxxx99| 制服诱惑一区二区| 福利视频一区二区三区| 日韩在线资源| 欧美专区亚洲专区| 人妻丰满熟妇aⅴ无码| 欧美色综合网| 91在线视频精品| 婷婷免费在线视频| 在线影院国内精品| 中文字幕一区二区三区人妻不卡| 国产一区激情| 91aaaa| 国产不卡在线| 欧美放荡的少妇| 青青草自拍偷拍| 日韩精品亚洲专区| 日本精品一区二区三区高清 久久| aa国产成人| 精品国产1区2区3区| 强行糟蹋人妻hd中文| 国产一区二区视频在线| 亚洲精品人成| 欧美天堂一区| 最近2019中文字幕mv免费看| 美女黄页在线观看| 国产精品人成在线观看免费| 网站一区二区三区| 成人在线丰满少妇av| 国产精品久久久久秋霞鲁丝| 国产黄色片在线播放| 日本精品一级二级| 91麻豆精品国产91久久综合| 日本成人中文字幕在线视频 | 最新国产精品自拍| 欧美精品国产一区二区| 波多野结衣成人在线| 青草在线视频在线观看| 精品国产露脸精彩对白 | 91成人免费电影| 亚洲av成人无码久久精品| 日韩经典中文字幕一区| 亚洲国产一区二区三区在线| 欧美黑粗硬大| 精品中文字幕视频| 丁香花免费高清完整在线播放| 亚洲国产裸拍裸体视频在线观看乱了 | 黑人巨大亚洲一区二区久| 亚洲欧美制服另类日韩| www.亚洲激情| ...中文天堂在线一区| 丰满少妇一区二区三区专区| 99精品免费网| 日韩妆和欧美的一区二区| 成人国产一区二区三区精品麻豆| 日韩中文字在线| www.黄色国产| 一本色道亚洲精品aⅴ| ass极品国模人体欣赏| 国产一区二区日韩精品| 人妻无码久久一区二区三区免费| 任你躁在线精品免费| 国产精品国产亚洲伊人久久| 里番在线观看网站| 亚洲电影中文字幕| 波多野结衣av无码| 亚洲综合色婷婷| 国产成人无码精品久久二区三| 免费在线观看精品| 国产乱人伦精品一区二区三区| 神马香蕉久久| 91精品久久久久久久久| av中文在线资源库| 一色桃子一区二区| www.黄色一片| 欧美视频你懂的| 久久97人妻无码一区二区三区| 91丨porny丨最新| 一起操在线视频| 99re国产精品| 五月天男人天堂| 在线看成人短视频| 91中文字精品一区二区| 成人看片网页| 午夜免费久久久久| 日韩黄色影院| 亚洲欧美精品在线| 亚洲精品成人区在线观看| 欧美主播一区二区三区| 97人人澡人人爽人人模亚洲| 一区在线中文字幕| 国产av自拍一区| 成人午夜私人影院| 欧美又黄又嫩大片a级| 免费在线观看成人av| 日韩一区二区高清视频| 日韩电影免费在线观看| 久久一区二区三区av| 一区二区三区四区视频免费观看| 国产精品流白浆视频| 在线人成日本视频| 久久久久免费视频| 91网址在线观看| 色妞色视频一区二区三区四区| 亚洲欧美一区二区三| 精品日韩在线一区| 国产精品九九九九| 欧美日韩免费高清一区色橹橹| 黄网在线观看视频| 亚洲动漫第一页| 欧美卡一卡二卡三| 中文字幕一区二区三区精华液| 免费看91的网站| 久久久蜜桃精品| 在线观看国产免费视频| 丁香婷婷综合五月| 91精品国产高清91久久久久久| 激情欧美一区二区| 依人在线免费视频| 美国十次了思思久久精品导航| 成人中文字幕av| 久久资源在线| 熟女人妇 成熟妇女系列视频| 亚洲一区亚洲| 欧美日韩在线视频一区二区三区| 99精品热视频只有精品10| 亚洲 欧美 日韩 国产综合 在线| 亚洲性感美女99在线| 91免费黄视频| 一本色道久久综合亚洲精品高清| 免费看黄在线看| 亚洲成人中文| 欧美日韩成人免费视频| 国产精品老牛| 日韩精品视频久久| 日本三级亚洲精品| 色播五月综合网| 狠狠色综合色综合网络| 性生活在线视频| 国产·精品毛片| 欧美精品黑人猛交高潮| 久久久久国产免费免费| 大吊一区二区三区| 亚洲欧美日韩国产成人精品影院 | 99久久自偷自偷国产精品不卡| 欧美a在线观看| 国产精品免费一区二区三区| 久久综合五月婷婷| 欧美日韩无遮挡| 成人情趣视频| 亚洲欧美精品在线观看| 影音先锋日韩在线| 欧美深夜福利视频| 日本不卡123| 亚洲国产综合av| 99re热视频这里只精品 | 一区二区在线观看av| 日韩 欧美 综合| 欧美影院精品一区| 国产高清在线观看视频| 日韩精品免费在线视频观看| av电影在线网| 色综合导航网站| 另类激情视频| 亚洲综合在线中文字幕| 亚洲va久久| 国产又粗又硬又长| 国产精品丝袜xxxxxxx| 亚洲视频一二三四| 成人黄色在线网站| 国产不卡在线观看视频| 亚洲成人免费电影| 中文字幕网址在线| 亚洲精品在线三区| 69久久久久| 91sao在线观看国产| 91精品网站在线观看| 精品无人乱码一区二区三区的优势| av亚洲免费| 人妻少妇精品无码专区二区| 美日韩一级片在线观看| 800av在线播放| 亚洲欧美一区二区三区国产精品| 可以免费看的av毛片| 欧美一区二视频| 韩日在线视频| 久久久久久久久久久网站| 激情中国色综合| 精品一区二区三区免费毛片| 99久精品视频在线观看视频| 久久婷婷五月综合色国产香蕉| 国产一区二区导航在线播放| 中字幕一区二区三区乱码| 亚洲福利一二三区| 国产在成人精品线拍偷自揄拍| 亚洲欧美国产制服动漫| ririsao久久精品一区| 91亚洲精品视频| 日韩理论在线| 已婚少妇美妙人妻系列| 91在线免费播放| 国产性一乱一性一伧一色| 777久久久精品| 在线视频1区2区| 国产精品久久激情| 色棕色天天综合网| 97xxxxx| 99精品偷自拍| 久久精品视频6| 日韩欧美国产一区在线观看| 九义人在线观看完整免费版电视剧| 国产99久久精品一区二区永久免费 | 91香蕉视频网址| 日本欧美韩国一区三区| 欧美图片第一页| 色婷婷久久一区二区三区麻豆| 图片区 小说区 区 亚洲五月| 欧美激情亚洲自拍| 婷婷视频一区二区三区| 色婷婷777777仙踪林| 国产在线视频一区二区三区| 少妇高潮在线观看| 欧美日韩国产影片| 欧美日韩xx| 91麻豆国产语对白在线观看| 香蕉国产精品| 污视频在线观看免费网站| 亚洲视频资源在线| 精品人妻一区二区三区换脸明星| 欧美成人精品xxx| 欧美精品影院| av网站大全免费| 99久久国产综合精品女不卡| 亚洲午夜18毛片在线看| 亚洲色图25p| 97欧美成人| 中文字幕久精品免| 国产精品亚洲视频| 国产一级一片免费播放放a| 日韩电影大片中文字幕| 欧美极品免费| 亚洲视频sss| 国产丶欧美丶日本不卡视频| 国产无套粉嫩白浆内谢| 日韩电影中文字幕在线| 最新欧美电影| 日本福利视频导航| 成人精品gif动图一区| 啦啦啦免费高清视频在线观看| 亚洲人成啪啪网站| 亚洲综合资源| 久久久久久人妻一区二区三区| 2024国产精品| 91麻豆一区二区| 久久久久久久久久久久久久久久久久av| 日韩av影院| 中文字幕亚洲欧洲| 亚洲一区二区精品视频| 欧美成人片在线| 91精品国产综合久久久久久久久 | 亚洲aⅴ乱码精品成人区| 国产福利精品在线| 在线中文字幕第一区| 欧美成人三级伦在线观看| 欧美视频精品在线| 1区2区在线| 亚洲欧洲精品在线| av亚洲精华国产精华| 一区二区自拍偷拍| 久久久久久久久久久亚洲| 欧美日韩黑人| 中文字幕人妻一区| 欧美午夜精品一区二区蜜桃| 亚洲h片在线看| 日韩欧美在线一区二区| 成人av在线播放网址| 在线观看中文字幕2021| 欧美激情一级二级| 91综合网人人| 成人影视免费观看| 日韩一级片网址| 成人不卡视频| 国精产品一区一区三区视频| 国产精品丝袜久久久久久app| 日本精品一二区| 91色在线观看| 日本sm残虐另类|