[Azure] C# + Microsoft.Azure.Cosmos.Table v1+ Azure Storage Table - 使用 ETag 修改資料保持資料一致性。

2021-01-08

今天要來聊聊 ETag 使用方法,在之前 Azure Storage Blob 中 我寫過一篇文章 C# + Azure.Storage.Blobs v12 - 判斷檔案存在、取得 ETag 、判斷 ETag 刪除檔案 ,其實概念是一樣的,不知道這算不算是一種 NoSQL 的 control 資料正確性的技巧,在 Azure Storage Table 中,來判斷 你是不是持有最後的權杖可以修改其資料..



前置作業 首先你要 安裝 nuget https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Table ,這邊我撰寫案例是用 .net core 3.1;在 Azure Portal  開一個 儲存體帳戶,並且在左側的存取金鑰中拿到 Connection String.


範例說明, 我先把一筆資料(PartitionKey: CLASSA , RowKey: DATAKEY1 ) 讀取出來,分別為 data1, data2 , 之後我修改 data1 後寫回,再將data2 直接寫回,最後我再把 data2 的 ETag=* 在寫回。


Result:

{"Name":"DONMA1-INSERTORMERGE","Age":1,"Create":"2020-01-01T16:00:00Z","Friends":[],"Meta":"NODATA","LastLoginDate":"2021-01-06T01:58:46.18Z","PartitionKey":"CLASSA","RowKey":"DATAKEY1","Timestamp":"2021-01-07T16:10:03.054947+08:00","ETag":"W/\"datetime'2021-01-07T08%3A10%3A03.054947Z'\""}

Edit File And Replce Use data1
SUCCESS!

Edit File And Replce Use data2 , Old ETag
EDIT DATA2 FAIL , Old ETag:Precondition Failed

Edit File And Replce Use data2 , Etag=*
SUCCESS!

如預期的 因為 data2 第一次寫入時,因為 ETag 已經跟線上不同版本了,所以造成寫入失敗,但是當你設定 ETag=* 就擁有絕對寫入的權力。

之前我在 MSDN 有看到這,但是後來我找不到,這張圖就寫得很清楚。




這很概念很簡單,但是卻很重要,我每次換 SDK 都會測試一次。


當麻許的超技八 2014 | Donma Hsu Design.