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







































