第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

當(dāng)一個(gè)數(shù)據(jù)源事務(wù)失敗時(shí),Spring 無(wú)法回滾已提交的事務(wù)

當(dāng)一個(gè)數(shù)據(jù)源事務(wù)失敗時(shí),Spring 無(wú)法回滾已提交的事務(wù)

婷婷同學(xué)_ 2023-08-09 15:26:35
我正在開發(fā)一項(xiàng)微服務(wù),其中涉及多個(gè)數(shù)據(jù)源。為了簡(jiǎn)化起見,我在這里使用兩個(gè)數(shù)據(jù)源:MySql 和 Oracle。這是偽代碼。    domain.withNewTransaction {      mySql.executeUpdate("update mySqlTable")      oracle.executeUpdate("update oracleTable")    }有一天,在嘗試提交oracle更新時(shí)出現(xiàn)異常,但是我發(fā)現(xiàn)mysql更新已成功提交并且沒有回滾。我發(fā)現(xiàn)該框架正在使用ChainedTransactionManager.java來(lái)管理多個(gè)數(shù)據(jù)源提交。這是commit方法的代碼。public void commit(TransactionStatus status) throws TransactionException {        MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status;        boolean commit = true;        Exception commitException = null;        PlatformTransactionManager commitExceptionTransactionManager = null;        for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) {            if (commit) {                try {                    multiTransactionStatus.commit(transactionManager);                } catch (Exception ex) {                    commit = false;                    commitException = ex;                    commitExceptionTransactionManager = transactionManager;                }            } else {                // after unsucessfull commit we must try to rollback remaining transaction managers                try {                    multiTransactionStatus.rollback(transactionManager);                } catch (Exception ex) {                    LOGGER.warn("Rollback exception (after commit) (" + transactionManager + ") " + ex.getMessage(), ex);                }            }        }事實(shí)證明,當(dāng)一個(gè)數(shù)據(jù)源提交失敗時(shí),ChainedTransactionManager 只會(huì)回滾剩余未提交的數(shù)據(jù)源,與已提交的事務(wù)無(wú)關(guān)。我知道回滾已提交的事務(wù)是復(fù)雜且有風(fēng)險(xiǎn)的。我想知道應(yīng)用程序開發(fā)人員是否有更好的想法來(lái)處理多數(shù)據(jù)源事務(wù)提交失敗。提前致謝!
查看完整描述

1 回答

?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

跨多個(gè)數(shù)據(jù)源的事務(wù)

Grails 使用 Best Efforts 1PC 模式來(lái)處理跨多個(gè)數(shù)據(jù)源的事務(wù)。

Best Efforts 1PC 模式相當(dāng)通用,但在開發(fā)人員必須注意的某些情況下可能會(huì)失敗。這是一種非 XA 模式,涉及多個(gè)資源的同步單階段提交。由于未使用 2PC,因此它永遠(yuǎn)不可能像 XA 事務(wù)那樣安全,但如果參與者意識(shí)到其中的妥協(xié),通常就足夠好了。

基本思想是在事務(wù)中盡可能晚地延遲所有資源的提交,以便唯一可能出錯(cuò)的事情是基礎(chǔ)設(shè)施故障(而不是業(yè)務(wù)處理錯(cuò)誤)。依賴 Best Efforts 1PC 的系統(tǒng)認(rèn)為基礎(chǔ)設(shè)施故障很少見,因此它們有能力承擔(dān)風(fēng)險(xiǎn)以換取更高的吞吐量。如果業(yè)務(wù)處理服務(wù)也被設(shè)計(jì)為冪等的,那么在實(shí)踐中就不會(huì)出錯(cuò)。

BE1PC 實(shí)現(xiàn)是在 Grails 2.3.6 中添加的。。在此更改之前,其他數(shù)據(jù)源不會(huì)參與 Grails 中啟動(dòng)的事務(wù)。附加數(shù)據(jù)源中的事務(wù)基本上處于自動(dòng)提交模式。在某些情況下,這可能是想要的行為。一個(gè)原因可能是性能:在每個(gè)新事務(wù)開始時(shí),BE1PC 事務(wù)管理器都會(huì)為每個(gè)數(shù)據(jù)源創(chuàng)建一個(gè)新事務(wù)。通過在附加數(shù)據(jù)源的相應(yīng)配置塊中設(shè)置 transactional = false,可以將附加數(shù)據(jù)源保留在 BE1PC 事務(wù)管理器之外。readOnly = true 的數(shù)據(jù)源也將被排除在鏈?zhǔn)绞聞?wù)管理器之外(自 2.3.7 起)。

默認(rèn)情況下,BE1PC 實(shí)現(xiàn)會(huì)將所有實(shí)現(xiàn) Spring PlatformTransactionManager 接口的 bean 添加到鏈?zhǔn)?BE1PC 事務(wù)管理器中。例如,Grails 應(yīng)用程序上下文中可能的 JMSTransactionManager bean 將被添加到 Grails BE1PC 事務(wù)管理器的事務(wù)管理器鏈中。

您可以使用以下配置選項(xiàng)從 BE1PC 實(shí)現(xiàn)中排除事務(wù)管理器 bean:

grails.transaction.chainedTransactionManagerPostProcessor.blacklistPattern = '.*' 排除匹配是在事務(wù)管理器 bean 的名稱上完成的。將跳過 transactional = false 或 readOnly = true 的數(shù)據(jù)源的事務(wù)管理器,在這種情況下不需要使用此配置選項(xiàng)。XA 和兩階段提交 當(dāng)盡力而為 1PC 模式不適合處理跨多個(gè)事務(wù)資源(不僅是數(shù)據(jù)源)的事務(wù)時(shí),可以使用多種選項(xiàng)來(lái)向 Grails 應(yīng)用程序添加 XA/2PC 支持。

Spring 事務(wù)文檔包含有關(guān)集成不同應(yīng)用程序服務(wù)器的 JTA/XA 事務(wù)管理器的信息。在這種情況下,您可以在 resources.groovy 或 resources.xml 文件中手動(dòng)配置名為 transactionManager 的 bean。

還有 Atomikos 插件可用于 Grails 應(yīng)用程序中的 XA 支持。

查看完整回答
反對(duì) 回復(fù) 2023-08-09
  • 1 回答
  • 0 關(guān)注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)