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 支持。
添加回答
舉報(bào)