[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=* 在寫回。

var tableClient = CloudStorageAccount.Parse(_ConnectionString).CreateCloudTableClient(new TableClientConfiguration()); var table = tableClient.GetTableReference("table1"); var data1 = table.Execute(TableOperation.Retrieve<User>("CLASSA", "DATAKEY1")).Result as User; var data2 = table.Execute(TableOperation.Retrieve<User>("CLASSA", "DATAKEY1")).Result as User; Console.WriteLine("Source Data :\r\n "); Console.WriteLine(JsonConvert.SerializeObject(data1)); Console.WriteLine(""); Console.WriteLine("Edit File And Replce Use data1"); data1.Meta = "EDIT DATA1"; try { table.Execute(TableOperation.Replace(data1)); Console.WriteLine("SUCCESS!"); } catch (Exception ex) { Console.WriteLine("EDIT DATA1 FAIL:" + ex.Message); } Console.WriteLine(""); Console.WriteLine("Edit File And Replce Use data2 , Old ETag"); data2.Meta = "EDIT DATA2"; try { table.Execute(TableOperation.Replace(data2)); Console.WriteLine("SUCCESS!"); } catch (Exception ex) { Console.WriteLine("EDIT DATA2 FAIL , Old ETag:" + ex.Message); } Console.WriteLine(""); Console.WriteLine("Edit File And Replce Use data2 , Etag=*"); data2.Meta = "EDIT DATA2 - ETAG = * "; data2.ETag = "*"; try { table.Execute(TableOperation.Replace(data2)); Console.WriteLine("SUCCESS!"); } catch (Exception ex) { Console.WriteLine("EDIT DATA2 , Etag=* FAIL:" + ex.Message); }


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.