精品欧美一区二区三区在线观看 _久久久久国色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在线网毛片| 亚洲精品久久久久久动漫器材一区| 欧美日韩高清| 欧美精品久久一区| 无码粉嫩虎白一线天在线观看 | 日本不卡二区| 国产三级午夜理伦三级| 国产一区白浆| 麻豆国产精品va在线观看不卡| 三级电影在线看| 国产专区精品| 欧美偷拍一区二区| 精品少妇一区二区三区在线| 国产cdts系列另类在线观看| 久久亚洲综合色一区二区三区 | 国内自拍视频网| av日韩国产| 国产精品第四页| 免费中文日韩| 欧美一级淫片免费视频魅影视频| 久久99久久精品| 日韩av黄色在线观看| 久热这里只有精品在线| 久久久9色精品国产一区二区三区| 日韩精品免费观看| 永久免费黄色片| 最新日韩一区| 色欧美日韩亚洲| www.中文字幕在线| 爱看av在线| 一区二区三区.www| 国产精品88久久久久久妇女| 日本韩国在线视频爽| 久久精品欧美日韩| 欧美日韩高清免费| 欧美日韩在线精品一区二区三区激情综| 国产成人日日夜夜| 亚洲一区二区三区四区视频| 国产影视一区二区| 麻豆精品精品国产自在97香蕉 | 精品一区二区三区中文字幕在线 | 日本中文字幕不卡免费| 国产精品老女人| 亚洲乱亚洲高清| 性色av一区二区三区| 国产无遮挡免费视频| 精品99视频| 性色av一区二区三区免费| 成人免费看片98| 在线播放亚洲| 91av在线播放| 人妻 日韩精品 中文字幕| 欧美资源在线| 国产精品69精品一区二区三区| 无码人妻久久一区二区三区不卡| 丝袜美腿亚洲色图| 国产精品福利在线观看网址| 亚洲手机在线观看| 国产综合色精品一区二区三区| 亚洲精品免费一区二区三区| www.桃色av嫩草.com| 成人三级伦理片| 免费精品视频一区| av在线播放免费| 亚洲天天做日日做天天谢日日欢 | 香蕉视频在线网址| 日韩激情av| 精品美女久久久久久免费| 欧美极品欧美精品欧美图片| 亚洲人免费短视频| 欧美精品在线观看一区二区| 亚洲成人av免费观看| 精品三级av在线导航| 亚洲欧美资源在线| 秋霞欧美一区二区三区视频免费 | 1024国产精品| 国产 日韩 欧美在线| 樱桃视频成人在线观看| 欧美日韩视频专区在线播放| 蜜桃视频无码区在线观看| 麻豆一区一区三区四区| 色偷偷亚洲男人天堂| 国产va在线播放| 久久福利影视| 96精品久久久久中文字幕| 污视频在线免费| 国产精品久久久一区麻豆最新章节| 国产日产欧美一区二区| 一区二区精品伦理...| 欧美日韩国产另类一区| 中文字幕人妻一区| 成人看的视频| 性欧美暴力猛交69hd| 一级黄色片在线看| av电影在线观看一区| 亚洲一区综合| 97se综合| 精品国产成人系列| 亚洲女人毛茸茸高潮| 国产精品久久久久9999高清| 91九色综合久久| 国外av在线| 亚洲国产一区二区视频| 亚洲欧美久久久久| 欧美精品中文| 久久91精品国产| 一级特黄免费视频| 99久久综合精品| 亚洲天堂第一区| 国产亚洲精彩久久| 日韩精品中文字幕有码专区| 妺妺窝人体色www婷婷| 美女精品一区二区| 欧美日韩亚洲一区二区三区在线观看 | 久久美女视频| 日韩av电影在线播放| 日韩在线观看视频一区二区三区| 亚洲色图19p| 色www免费视频| 国产一区二区三区四区二区| 91av在线视频观看| 刘亦菲毛片一区二区三区| 1区2区3区国产精品| 爱爱爱爱免费视频| 精品免费视频| 国产成人亚洲综合| 欧美18xxxxx| 色综合久久天天| 懂色av粉嫩av蜜乳av| 亚洲二区免费| 国产精品免费一区二区| 色呦呦视频在线观看| 日韩一级片在线播放| 国产精品99久久久久久成人| 久久精品99久久久| 亚洲免费视频一区| 日本久久久久| 久久人体大胆视频| 国产又粗又大又爽| 最近日韩中文字幕| www.色就是色.com| 亚洲先锋影音| 91久久偷偷做嫩草影院| 97caopor国产在线视频| 日韩区在线观看| 久久亚洲国产成人精品性色| 成人综合在线网站| 国自产拍偷拍精品啪啪一区二区| 欧美日韩导航| 日韩美女福利视频| 91啦中文在线| 欧美另类一区二区三区| 欧美人禽zoz0强交| 成年人国产精品| 久久久久久久久久久视频| 综合国产视频| 国产精品永久免费| 在线观看国产原创自拍视频| 337p亚洲精品色噜噜狠狠| 久久久久久久久久网站| 成人一区在线观看| 亚洲精品乱码久久久久久自慰| 亚洲日产av中文字幕| 国产精品久久久久久久电影| www久久日com| 亚洲精品www久久久| 伦av综合一区| 亚洲色图一区二区三区| 欧类av怡春院| 免费久久99精品国产| 激情图片qvod| 九九综合在线| 成人免费激情视频| 福利在线免费视频| 一区二区三区回区在观看免费视频| 一区二区精品视频在线观看| 亚洲一区二区三区四区不卡| 三上悠亚ssⅰn939无码播放| 精东粉嫩av免费一区二区三区| 99热久久这里只有精品| 精品久久久亚洲| 999久久久| 亚洲成a人片| 欧美成人一区在线| 国产高清av在线| 日韩精品影音先锋| 免费视频网站在线观看入口| 亚洲精品福利视频网站| 欧美老熟妇乱大交xxxxx| 国产综合色产在线精品| 成年人免费在线播放| 女人色偷偷aa久久天堂| 欧美日韩综合久久| 日韩激情精品| 国产精品美女av| 老色鬼在线视频| 久久夜色精品国产欧美乱| 三级av在线播放| 91精品国产丝袜白色高跟鞋| 亚洲 欧美 成人| 一区二区久久久| av在线播放中文字幕| 99re热视频精品| 免费观看黄网站| 日本在线不卡视频| 国产一级爱c视频| 欧美在线高清| 亚洲欧美日韩另类精品一区二区三区| 欧美成人一区在线观看| 成人在线中文字幕| abab456成人免费网址| 欧美最猛性xxxxx(亚洲精品)| 欧美草逼视频| 久久影院免费观看| √新版天堂资源在线资源| 亚洲欧美中文日韩在线| 天堂v视频永久在线播放| 精品免费国产二区三区| 国产丝袜视频在线观看| 欧美美女网站色| 伊人免费在线观看| 欧美日韩中文字幕一区| 国产免费www| 在线日韩一区二区| 午夜精品久久久久久久蜜桃| 欧美日韩综合视频网址| 国产午夜久久久| 亚洲图片自拍偷拍| 久久久久久久久精| 一区av在线播放| 麻豆亚洲av熟女国产一区二| 一区二区三区在线视频播放| 亚洲色图综合区| 亚洲精品久久嫩草网站秘色| 亚洲国产精品免费在线观看| 亚洲精选视频在线| 美女毛片在线观看| 亚洲国产日产av| 日韩欧美视频在线免费观看| 天天综合天天做天天综合| 日本一区二区不卡在线| 天天综合天天综合色| 成年免费在线观看| 欧美日韩中文字幕在线| 久草视频在线免费| 欧美日韩综合不卡| 国产ts变态重口人妖hd| 欧美变态tickle挠乳网站| 国产成人手机在线| 亚洲精品mp4| 国产乱视频在线观看| 色老头一区二区三区| 免费黄色网址在线观看| 欧美剧在线观看| 999福利在线视频| 欧美一区亚洲一区| av成人在线看| 亚洲va电影大全| 国产伦乱精品| 奇米精品在线| 图片小说视频色综合| 激情五月婷婷六月| 国产一区白浆| 一个色综合久久| 粉嫩绯色av一区二区在线观看| 亚洲精品中文字幕在线播放| 国产欧美一区二区三区在线看蜜臀 | 女性生殖扒开酷刑vk| 91亚洲永久精品| 久久久久亚洲AV成人无在| 亚洲精品ww久久久久久p站| 国产在线观看免费av| 日本久久一区二区| aaa一区二区| 亚洲免费人成在线视频观看| 青青影院在线观看| 久久久久亚洲精品| 超薄肉色丝袜脚交一区二区| 成人久久久久爱| 日韩极品少妇| 亚洲永久一区二区三区在线| 国产精品分类| 99热手机在线| 成人高清伦理免费影院在线观看| 国产精品密蕾丝袜| 一区二区三区中文字幕电影 | bl视频在线免费观看| 国产精品爱久久久久久久| 亚洲高清在线一区| 亚洲高清资源综合久久精品| 黄色av成人| 中文字幕22页| xfplay精品久久| 精品在线视频免费观看| 欧美日韩一级黄| 偷拍自拍在线| 欧美成人全部免费| 成人精品国产亚洲| 精品欧美一区二区在线观看视频 | 国产精品激情偷乱一区二区∴| 国产成人精品亚洲男人的天堂| 欧美日韩国产中文| 日本亚洲欧美| 欧美激情亚洲综合一区| 日韩精品一页| 日韩美女一区| 亚洲在线黄色| 中文字幕天堂av| 亚洲人成伊人成综合网小说| 中文字幕第一页在线播放| 日韩毛片中文字幕| 黄色成人在线网| 成人性生交大片免费看视频直播 | 免费在线看黄色片| 极品少妇一区二区| 免费黄色片网站| 一本到不卡免费一区二区| 黄色片一区二区三区| 九九九久久久久久| 先锋影音网一区二区| 日本视频一区二区不卡| 久久综合九色综合欧美狠狠| 在线免费播放av| 亚洲3atv精品一区二区三区| 亚洲h视频在线观看| 久久在线观看视频| 亚洲毛片在线免费| 亚洲美女自拍偷拍| 精品中文字幕一区二区| 91麻豆精品久久毛片一级| 在线看国产一区二区| 成人午夜电影在线观看| 国产精品美女在线观看| 欧州一区二区| 日韩一级理论片| 欧美极品美女视频| 这里只有久久精品视频| 中文字幕日韩免费视频| 精品久久在线| 中文网丁香综合网| 黑人巨大精品欧美一区| 日韩一级片av| 精品国产伦一区二区三区免费| 国产丝袜在线播放| 精品国产一区二区三区麻豆小说| 国产一区二区三区的电影| 99久久人妻无码精品系列| 日本韩国欧美国产| jizz亚洲| 亚洲iv一区二区三区| 在线欧美福利| 久久久精品人妻无码专区| 日本韩国欧美一区| 麻豆tv免费在线观看| 91免费在线观看网站| 亚洲三级视频| 日韩中文字幕有码| 91.成人天堂一区| 免费在线观看的电影网站| 久久国产精品久久| 喷白浆一区二区| 成人在线观看小视频| 精品国产不卡一区二区三区| 最新中文字幕在线播放| 色一情一区二区三区四区| 狠狠色狠狠色综合| 日本网站在线免费观看| 尤物九九久久国产精品的特点| 曰本一区二区| 成人毛片视频网站| 成人免费在线观看入口| 天天色棕合合合合合合合| 欧洲一区二区视频| 中文字幕亚洲综合久久五月天色无吗''| 人妻 丝袜美腿 中文字幕| 一本色道久久综合狠狠躁的推荐| 免费在线观看av片| 国产偷久久久精品专区| 免费不卡在线观看| 精品视频在线观看免费| 在线播放日韩精品| 久久婷婷国产| 亚洲一区二区福利视频| 精品国产乱码久久久久久天美| 9191在线| 久久久久久精| 国产精品一区二区x88av| 成人午夜淫片100集| 欧美大胆a视频| 精品国产一区二区三区久久久蜜臀| 亚洲av午夜精品一区二区三区| 91福利社在线观看| 久久不射影院| 中文字幕久久综合| 久久久久亚洲蜜桃| 亚洲成人77777| 国产自摸综合网| 亚洲一区二区成人| 精品小视频在线观看| 久久久999国产精品|