支持無代碼的事務(wù)API
譯文【51CTO.com快譯】事務(wù)的目的是保護(hù)數(shù)據(jù)不會受到數(shù)據(jù)庫無法完成部分更新的影響。事務(wù)API現(xiàn)在可用于無代碼應(yīng)用程序。
交易接口
使用事務(wù)API,數(shù)據(jù)庫可以執(zhí)行分組為單個事務(wù)的多個數(shù)據(jù)庫請求。當(dāng)這些分組數(shù)據(jù)庫操作中的任何一個失敗時,整個事務(wù)都會回滾——這意味著同一事務(wù)中的任何更改都將被取消。
到目前為止,事務(wù)API僅限于使用代碼構(gòu)建的后端用戶。而現(xiàn)在,API也可供無代碼開發(fā)人員使用。
以下描述了事務(wù)API的工作原理及其一些好處。然后,將提供一個以無代碼的事務(wù)API的示例。
事務(wù)的好處
那么,事務(wù)API可以做些什么?以下來看看其中的一些好處。
首先,如果任何操作失敗,整個事務(wù)將回滾——無需從代碼中執(zhí)行任何清理。換句話說,不會對數(shù)據(jù)庫進(jìn)行永久更改,如果操作失敗,則需要修復(fù)這些更改。
其次,從客戶端的角度來看,只有一個請求發(fā)送到服務(wù)器——執(zhí)行事務(wù)的請求。例如,假設(shè)一個事務(wù)執(zhí)行兩個操作:(1)在數(shù)據(jù)庫中保存一個對象;(2)在保存的對象和用查詢標(biāo)識的其他對象之間建立關(guān)系。使用事務(wù)API,客戶端應(yīng)用程序只向服務(wù)器發(fā)送一個請求。
第三,事務(wù)為數(shù)據(jù)庫提供一致性和參照完整性。換句話說,事務(wù)可以確保數(shù)據(jù)庫中沒有“臟數(shù)據(jù)”。這有助于保持客戶端代碼更清晰和數(shù)據(jù)一致。
事務(wù)API的工作原理
無后端事務(wù)依賴于以下概念:
- 工作單元——是事務(wù)請求的整個有效負(fù)載,它將多個單獨(dú)的數(shù)據(jù)庫操作組合成一個對象中。添加到工作單元的所有操作都有一個序列號,并且將按照添加順序在服務(wù)器端執(zhí)行。一個工作單元本質(zhì)上代表一個事務(wù)。
- 數(shù)據(jù)庫操作——在事務(wù)中執(zhí)行的單個操作。這可以是創(chuàng)建、檢索、更新、刪除和關(guān)系管理(創(chuàng)建、更新、刪除)操作。
- 操作結(jié)果——表示單個數(shù)據(jù)庫操作結(jié)果的實體。一個操作的結(jié)果可以在其他后續(xù)操作中引用。
例如,“創(chuàng)建”操作返回一個結(jié)果,這個結(jié)果代表著保存在數(shù)據(jù)庫中的對象。可以在操作中引用該對象以設(shè)置對象的關(guān)系。或者,可以從操作結(jié)果中“提取”特定屬性的值,并將其用于同一事務(wù)中的其他操作。
下圖說明了這些相互關(guān)聯(lián)的概念:
工作單元API
無后端事務(wù)API的核心是一個名為UnitOfWork的請求。客戶端應(yīng)用程序使用它來組成事務(wù)。
組合事務(wù)意味著將各種數(shù)據(jù)庫操作添加到一個工作單元中。用于從數(shù)據(jù)庫中檢索對象的“查找”操作如上圖所示。通過使用一個操作的輸出/結(jié)果作為另一個操作的輸入,這些操作可以相互“鏈接”。例如,在下圖中,看到了一個“更新”操作的示例,其中包含引用事務(wù)中先前操作的選項。
當(dāng)服務(wù)器收到UnitOfWork請求時,它開始處理其操作。服務(wù)器在單個數(shù)據(jù)庫事務(wù)的場景中執(zhí)行所有操作。
如果所有的操作失敗,無后端將回滾所有更改,并將有關(guān)每個操作的結(jié)果信息返回給客戶端。但是,如果所有操作都成功,則提交整個數(shù)據(jù)庫事務(wù)。這意味著數(shù)據(jù)將在數(shù)據(jù)庫中完成更新。
事務(wù)隔離
使用后端事務(wù)API,可以為其事務(wù)配置隔離級別。隔離級別決定了無后端數(shù)據(jù)庫如何將某個事務(wù)與同時運(yùn)行的所有其他事務(wù)分開。
如果沒有任何隔離,一個事務(wù)可以修改另一個事務(wù)正在讀取的數(shù)據(jù),這樣做會造成數(shù)據(jù)不一致。隔離級別決定了其事務(wù)與其他事務(wù)的隔離程度。這是通過對事務(wù)中檢索到的數(shù)據(jù)應(yīng)用鎖定來實現(xiàn)的。不同隔離的級別意味著不同的鎖定機(jī)制,每個鎖定機(jī)制也會產(chǎn)生不同的數(shù)據(jù)讀取現(xiàn)象。
操作結(jié)果
事務(wù)API最強(qiáng)大的元素之一是能夠在同一事務(wù)內(nèi)的其他后續(xù)操作中使用操作結(jié)果。這是通過所有事務(wù)操作遵循的“協(xié)議”實現(xiàn)的:每個操作都可以有一個唯一的標(biāo)識符。
標(biāo)識符可以在另一個操作中使用,以引用使用其操作的結(jié)果。這允許產(chǎn)生“鏈接效應(yīng)”,其中數(shù)據(jù)來自一個操作,然后輸入到另一個操作中。例如下面的例子。該示例在數(shù)據(jù)庫中保存一個新對象,然后在創(chuàng)建的對象和另一個表中的對象之間建立關(guān)系。
將對象保存在數(shù)據(jù)庫中的操作為每個操作分配一個唯一的ID,然后在后續(xù)操作中使用這個ID來建立對象與其子對象之間的關(guān)系。
無代碼事務(wù)示例
可以通過以下無代碼事務(wù)來分解每個步驟中發(fā)生的事情。此無代碼塊用于存儲購買的詳細(xì)信息。以下介紹這個API調(diào)用的每一步。
作為參考,本例中兩個表的表架構(gòu)如下所示。以下是這個API服務(wù)每個步驟的細(xì)分:
首先,在本例中,將創(chuàng)建一個名為TransactionsDemo的API服務(wù),其方法名稱為createObjectsSaveRelation。不必創(chuàng)建新的API服務(wù)來運(yùn)行本示例中的邏輯。其所有步驟幾乎都可以用于創(chuàng)建的任何無代碼邏輯。
接下來,創(chuàng)建一個變量myTx,并將其內(nèi)容設(shè)置為一個新的事務(wù)。事務(wù)的隔離設(shè)置為“可重復(fù)讀取”。
這是事務(wù)的“包裝器”。在這里,實現(xiàn)了組成名為myTx的事務(wù)(或UnitOfWork)的操作。需要注意的是,順序很重要。特別是如果操作依賴于同一事務(wù)中的另一個操作,則需要確保按正確的順序排列操作步驟以實現(xiàn)所需的結(jié)果。
作為事務(wù)中的第一個操作,執(zhí)行名為createOrderOp的“創(chuàng)建”操作。此操作在Order表中創(chuàng)建一個orderId=061821-CV1和amount=189.2的對象。
對于第二個操作,執(zhí)行“批量創(chuàng)建”操作并將其命名為createOderItemsOp。在這個操作中,創(chuàng)建了兩個數(shù)據(jù)對象——數(shù)量為10的紙巾和數(shù)量為20的浴室紙巾。這些項目被添加到表OrderItem中。
最后,執(zhí)行“SetRelation”操作將子數(shù)據(jù)對象連接到父數(shù)據(jù)對象。不需要為此操作命名(id)。對于父級可以訪問Order表。然后通過訪問createOrderOp操作的結(jié)果找到父對象。而正在創(chuàng)建關(guān)系的列稱為orderDetails。為了找到子選項,將再次訪問先前操作的結(jié)果。這次是createOrderItemsOp操作。
事務(wù)結(jié)果
這個API調(diào)用的結(jié)果將是:
無代碼示例表架構(gòu)
訂單表架構(gòu):
OrderItem表架構(gòu):
原文標(biāo)題:Transaction API Support for Codeless,作者:Chris Fanchi
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】