Sharding-JDBC-分布式事務(wù)

分布式事務(wù)

1. 兩階段提交-XA

1.1 引入Maven依賴

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-transaction-xa-core</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>

XA事務(wù)管理器將以SPI的方式被Sharding-JDBC所加載墓毒。

1.2 Atomikos參數(shù)配置 (可選)

ShardingSphere默認(rèn)的XA事務(wù)管理器為Atomikos,在項(xiàng)目的logs目錄中會(huì)生成xa_tx.log, 這是XA崩潰恢復(fù)時(shí)所需的日志绞呈,請(qǐng)勿刪除纱意。

也可以通過在項(xiàng)目的classpath中添加jta.properties來定制化Atomikos配置項(xiàng)婶溯。具體的配置規(guī)則請(qǐng)參考Atomikos的官方文檔

2. 第三方BASE實(shí)現(xiàn)-Saga

目前Apache/incubator-shardingsphere暫無BASE事務(wù)的實(shí)現(xiàn),但是仍然可以使用第三方實(shí)現(xiàn)的Saga事務(wù)迄委。

項(xiàng)目地址: shardingsphere-spi-impl

文中涉及${shardingsphere-spi-impl.version} 的jar暫未發(fā)布到maven中央倉褐筛,因此需要您根據(jù)源碼自行部署。

2.1 引入Maven依賴

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-transaction-base-saga</artifactId>
    <version>${shardingsphere-spi-impl.version}</version>
</dependency>

Saga事務(wù)管理器將以SPI的方式被Sharding-JDBC所加載叙身。

2.2 Saga相關(guān)配置

可以通過在項(xiàng)目的classpath中添加saga.properties來定制化Saga事務(wù)的配置項(xiàng)渔扎。 配置項(xiàng)的屬性及說明如下:

屬性名稱 默認(rèn)值 說明
saga.actuator.executor.size 5 Saga引擎所使用的線程池大小
saga.actuator.transaction.max.retries 5 Saga引擎對(duì)失敗SQL的最大重試次數(shù)
saga.actuator.compensation.max.retries 5 Saga引擎對(duì)失敗SQL的最大嘗試補(bǔ)償次數(shù)
saga.actuator.transaction.retry.delay.milliseconds 5000 Saga引擎對(duì)失敗SQL的重試間隔,單位毫秒
saga.actuator.compensation.retry.delay.milliseconds 3000 Saga引擎對(duì)失敗SQL的補(bǔ)償間隔信轿,單位毫秒
saga.persistence.enabled false Saga引擎對(duì)快照及執(zhí)行日志進(jìn)行持久化
saga.actuator.recovery.policy ForwardRecovery Saga引擎對(duì)失敗事務(wù)的補(bǔ)償策略晃痴,F(xiàn)orwardRecovery為最大努力送達(dá),BackwardRecovery為反向SQL補(bǔ)償

2.3 Saga 快照及日志持久化

當(dāng)saga.persistence.enabled設(shè)置為true時(shí)财忽,Saga引擎將會(huì)對(duì)事務(wù)的快照及執(zhí)行日志進(jìn)行持久化操作倘核。 持久化操作默認(rèn)通過HikariCP鏈接池寫入到MySQL、H2或PostgreSQL數(shù)據(jù)庫中即彪。 關(guān)于持久化的配置笤虫,同樣添加在saga.properties中,配置項(xiàng)及說明如下:

屬性名稱 默認(rèn)值 說明
saga.persistence.ds.url Saga持久化的數(shù)據(jù)庫JDBC鏈接
saga.persistence.ds.username Saga持久化的數(shù)據(jù)庫用戶名
saga.persistence.ds.password Saga持久化的數(shù)據(jù)庫密碼
saga.persistence.ds.max.pool.size 50 Saga持久化的數(shù)據(jù)庫鏈接池最大連接數(shù)
saga.persistence.ds.min.pool.size 1 Saga持久化的數(shù)據(jù)庫鏈接池最小連接數(shù)
saga.persistence.ds.max.life.time.milliseconds 0(無限制) Saga持久化的數(shù)據(jù)庫鏈接最大存活時(shí)間祖凫,單位毫秒
saga.persistence.ds.idle.timeout.milliseconds 60 * 1000 Saga持久化的數(shù)據(jù)庫鏈接空閑回收時(shí)間琼蚯,單位毫秒
saga.persistence.ds.connection.timeout.milliseconds 30 * 1000 Saga持久化的數(shù)據(jù)庫鏈接超時(shí)時(shí)間,單位毫秒

由于用戶使用的數(shù)據(jù)庫類型與事務(wù)大小不一定一致惠况,因此可以在項(xiàng)目的classpath中添加schema-init.sql來定制化持久化的表結(jié)構(gòu)遭庶,Saga引擎會(huì)自動(dòng)根據(jù)其中SQL創(chuàng)建。 如下以MySQL為例稠屠,用戶可自行修改峦睡,以匹配不同數(shù)據(jù)庫類型及字段長度。

-- MySQL init table SQL

CREATE TABLE IF NOT EXISTS saga_snapshot(
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  transaction_id VARCHAR(255) null,
  snapshot_id int null,
  revert_context VARCHAR(255) null,
  transaction_context VARCHAR(255) null,
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX transaction_snapshot_index(transaction_id, snapshot_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS saga_event(
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  saga_id VARCHAR(255) null,
  type VARCHAR(255) null,
  content_json TEXT null,
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX saga_id_index(saga_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8

2.4 Saga 快照及日志持久化SPI定制

默認(rèn)通過數(shù)據(jù)庫來持久化快照和日志并不一定能夠滿足用戶對(duì)業(yè)務(wù)和性能的需求权埠。因此Saga引擎提供SPI允許用戶定制化持久化部分榨了。 當(dāng)saga.persistence.enabled設(shè)置為true且Saga引擎監(jiān)測(cè)到有持久化SPI時(shí),Saga引擎將通過用戶實(shí)現(xiàn)的SPI代替默認(rèn)持久化進(jìn)行持久化工作攘蔽。 用戶只需要實(shí)現(xiàn)接口io.shardingsphere.transaction.saga.persistence.SagaPersistence即可實(shí)現(xiàn)持久化SPI龙屉。 具體可參考項(xiàng)目sharding-transaction-base-saga-persistence-jpa,Maven引入:

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-transaction-base-saga-persistence-jpa</artifactId>
    <version>${shardingsphere-spi-impl.version}</version>
</dependency>

2.5 Saga 注意事項(xiàng)

  • 反向SQL需要主鍵满俗,請(qǐng)確保在表結(jié)構(gòu)中定義主鍵转捕。
  • 對(duì)于INSERT語句, 需要在SQL中顯示插入主鍵值唆垃,如INSERT INTO ${table_name} (id, value, ...) VALUES (11111, '', ....) (其中id為表主鍵)五芝。
  • 若需要自動(dòng)生成主鍵,可使用ShardingSphere的分布式主鍵(分布式主鍵不能為聯(lián)合主鍵)辕万。

3. 分布式事務(wù)接入端

ShardingSphere的事務(wù)類型存放在TransactionTypeHolder的本地線程變量中枢步,因此在數(shù)據(jù)庫連接創(chuàng)建前修改此值沉删,可以達(dá)到自由切換事務(wù)類型的效果。

注意:數(shù)據(jù)庫連接創(chuàng)建之后醉途,事務(wù)類型將無法更改矾瑰。

3.1 原生API

TransactionTypeHolder.set(TransactionType.LOCAL);

 TransactionTypeHolder.set(TransactionType.XA);

TransactionTypeHolder.set(TransactionType.BASE);

3.2 Spring注解

@ShardingTransactionType(TransactionType.LOCAL)
@Transactional

@ShardingTransactionType(TransactionType.XA)
@Transactional

@ShardingTransactionType(TransactionType.BASE)
@Transactional

注意:@ShardingTransactionType需要同Spring的@Transactional配套使用,事務(wù)才會(huì)生效结蟋。

Spring boot starter

引入Maven依賴:

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-transaction-jdbc-spring-boot-starter</artifactId>
    <version>${shardingsphere-spi-impl.version}</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectjweaver.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${springframework.version}</version>
</dependency>

<aspectjweaver.version>1.8.9</aspectjweaver.version>
<springframework.version>[4.3.6.RELEASE,5.0.0.M1)</springframework.version>

Spring namespace

引入Maven依賴:

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-transaction-jdbc-spring</artifactId>
    <version>${shardingsphere-spi-impl.version}</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectjweaver.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${springframework.version}</version>
</dependency>

<aspectjweaver.version>1.8.9</aspectjweaver.version>
<springframework.version>[4.3.6.RELEASE,5.0.0.M1)</springframework.version>

加載切面配置信息

<import resource="classpath:META-INF/shardingTransaction.xml"/>

分布式事務(wù)example

transaction-example

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末二鳄,一起剝皮案震驚了整個(gè)濱河市做修,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顿颅,老刑警劉巖恍涂,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝惰,死亡現(xiàn)場離奇詭異,居然都是意外死亡再沧,警方通過查閱死者的電腦和手機(jī)尼夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炒瘸,“玉大人淤堵,你說我怎么就攤上這事∏昀” “怎么了拐邪?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隘截。 經(jīng)常有香客問我扎阶,道長,這世上最難降的妖魔是什么婶芭? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任东臀,我火速辦了婚禮,結(jié)果婚禮上犀农,老公的妹妹穿的比我還像新娘惰赋。我一直安慰自己,他們只是感情好呵哨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布谤逼。 她就那樣靜靜地躺著,像睡著了一般仇穗。 火紅的嫁衣襯著肌膚如雪流部。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天纹坐,我揣著相機(jī)與錄音枝冀,去河邊找鬼舞丛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛果漾,可吹牛的內(nèi)容都是我干的球切。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绒障,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼吨凑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起户辱,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤鸵钝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庐镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩商,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年必逆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠堪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡名眉,死狀恐怖粟矿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损拢,我是刑警寧澤陌粹,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站探橱,受9級(jí)特大地震影響申屹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隧膏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一哗讥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胞枕,春花似錦杆煞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派桩,卻和暖如春构诚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铆惑。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工范嘱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送膳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓丑蛤,卻偏偏與公主長得像叠聋,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子受裹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 Saga相關(guān)概念 1987年普林斯頓大學(xué)的Hector Garcia-Molina和Kenneth Salem...
    shoukai閱讀 88,219評(píng)論 4 65
  • 原文鏈接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao閱讀 4,695評(píng)論 0 9
  • 再有人問你分布式事務(wù)碌补,把這篇扔給他 咖啡拿鐵純潔的微笑今天 前言 不知道你是否遇到過這樣的情況,去小賣鋪買東西棉饶,付...
    冬_2bf6閱讀 609評(píng)論 0 0
  • 我在最美的時(shí)節(jié)思念著你 夏日的螢火蟲 微小的光芒 照亮了唐詩宋詞泛黃的手卷 石碑上有古老的秘密在流傳 青竹染香 鴻...
    心一Sue閱讀 390評(píng)論 3 10
  • 生活中處處充滿驚喜砰盐。 我的人生也是闷袒。 因?yàn)槲揖鸵懒丝勇桑谖?0歲生日那天岩梳。 取出盒中最后一支煙,點(diǎn)燃晃择,深深吸了一口...
    張頸鹿的故事閱讀 195評(píng)論 0 0