閱讀464 返回首頁    go 人物


事務說明__用戶指南_雲數據庫 PetaData-阿裏雲

begin語句

  1. begin語句用於開啟單次事務;
  2. 對於連續begin,若用戶通過第一個begin/start transaction/set autocommit = 0開啟一個事務,稍後未進行提交而進行第二個begin/start transaction,那麼分布式數據庫將隱式地幫助用戶commit上一個事務,這個commit的特性與普通commit相同,提交完成後,將自動進入下一個事務,這個工作流程與mysql一致;
  3. 一個單行事務,如果不在顯式事務語句的保護下,若它是單分區的事務,那麼該單行事務將具有與mysql相同的事務特性,若它是跨分區的事務,那麼該單行事務將自動使用一階段提交分布式事務,在部分分區提交成功部分分區提交失敗時,可能導致回滾不一致;

commit語句

由於當前分布式數據庫僅使用了一階段提交事務,因此提交時,若一部分分區成功,而另一部分分區失敗或異常關閉連接,那麼將造成分區數據不一致,mysql的commit無論提交成功或失敗,都將退出事務,commit成功,則所有更新將可見,commit失敗,則所有更新將自動rollback;

rollback語句

無論分區回滾成功或失敗,抑或分區異常關閉連接,分布式數據庫保證始終向客戶端返回ok結果;

基本set語句

  1. set autocommit = 0/1語句:set autocommit = 0語句用於設置連接長期開啟事務,若用戶不顯示進行任何commit,則之前的更新均不會提交。對於autocommit由0轉1,若用戶通過set autocommit = 0開啟一個事務,稍後未進行提交而通過set autocommit = 1提交一個事務,那麼分布式數據庫將隱式地幫助用戶向所有分區發送一個set autocommit = 1,這條語句的特性與普通commit相同,由於mysql的commit會必然退出事務,此處的set autocommit = 1也將必然成功並返回ok結果,後續的操作將不再自動進入事務;
  2. set transaction isolation level {read uncommitted|read committed|repeatable read|serializable}語句:單分區事務的事務隔離級別兼容mysql的事務隔離級別,多分區事務的事務隔離級別總是為read_committed,set transaction isolation level XXXXXX與set tx_isolation = XXXXXX僅影響單分區事務的事務隔離級別;
  3. set transaction read only|write語句:該語句用於設置連接是否為隻讀或讀寫的;
  4. set names XXXXXX語句:該語句用來設置連接的字符集;
  5. 事務中,環境變量設置將向每一個參與事務的分區立即發送一條環境變量設置語句,除了set autocommit 0轉1之外,其它的set動作若失敗,則不會影響事務狀態;
  6. 連接內新建立的後端分區連接,均會進行一輪全量環境變量設置,保證新連接具有最新的環境變量內容;
  7. 不支持具有曆史依賴關係的環境變量,如set a = 1, set b = a + 1, set a = b + 1,所有環境變量的設置必須是自包含且冪等的單變量設置語句;

其他set語句

  1. 其它的環境變量均被解析器攔截,報告給用戶一個warning消息,即設置環境的動作未執行;
  2. 非事務中,環境變量設置過程與begin語句開啟的過程相同,均為延遲開啟,即用戶的環境變量語句或begin語句到達後,立即向用戶報告ok結果,待用戶真正的請求到達時,再根據請求涉及的後端分區,進行一輪獨立的環境變量設置或begin的過程,完成後,再進行實際的請求投遞,若這輪延遲的環境變量設置或begin失敗,則向用戶報錯,用戶下次請求到達時,仍然會進行一輪新的環境變量設置或begin的過程;
  3. 當前支持一些內建屬性的設置,詳情見“用戶內建屬性”一張;

分區異常關閉連接

若當前session處於事務中,而任意一個參與該事務的分區異常關閉了連接,則該session也將關閉與客戶端的連接,並回滾事務;

分區不一致

當前僅支持單分區的完整事務,如果一個請求更新了多個分區,則沒有分布式事務的保證,部分分區更新成功但部分分區更新失敗,則可能出現數據不一致;

事務狀態不一致:

  1. 事務中,遭遇單分區死鎖,該分區將退出事務狀態,其它分區可能仍然在事務狀態,此時分區事務狀態不一致,分布式數據庫要求client僅能發送rollback,而不會為client自動進行其它分區的rollback調用;
  2. 事務開啟時,begin/start transaction部分成功、部分失敗,則成功的部分分區連接將被關閉(減少參與失敗事務的分區數,減小事務失敗的影響),同時向client返回error結果;
  3. 事務開啟時,set autocommit = 0部分成功、部分失敗,則失敗的部分分區連接將被關閉(set autocommit = 0語句被延遲執行,此前已經向client保證了成功,此處僅能關閉執行失敗的部分分區,成功的分區將進入事務),同時向client返回error結果;

環境變量不一致

  1. 多行事務中,立即發送的環境變量設置語句部分成功、部分失敗,導致成功的分區使用新環境變量,失敗的分區使用舊環境變量,此時將向用戶返回環境變量不一致的錯誤,用戶仍然有機會進行rollback;
  2. 單行事務中,延遲發送的環境變量設置語句部分成功、部分失敗,導致成功的分區使用新環境變量,失敗的分區使用舊環境變量,此時將向用戶返回環境變量不一致的錯誤,用戶請求並未實際執行;

已提交數據不一致

  1. 單行事務跨分區語句,部分成功、部分失敗,此時將向client報出嚴重錯誤的異常,此時數據將不一致,並沒有任何rollback的機會;
  2. 多行事務跨分區語句,commit或隱式commit部分成功、部分失敗,此時將向client報出嚴重錯誤的異常,此時數據將不一致,並沒有任何rollback的機會;

未提交數據不一致

多行事務跨分區語句,普通語句部分成功、部分失敗,此時將報出數據不一致的異常,client仍然有rollback的機會;

死鎖問題

  1. mysql在發現事務中的普通語句存在死鎖後,將僅保留一個事務並允許其操作,同時清除其它死鎖事務,退出事務狀態;
  2. 若事務更新語句一次僅涉及一個分區,死鎖的行存在於兩個分區,那麼死鎖過程不會立即被檢測出來,多個事務的死鎖更新會請求鎖,直到鎖超時,然後由mysql通知更新error,這個error結果不會令分區退出事務狀態,後續的操作與普通事務相同,分布式數據庫將向用戶返回鎖超時錯誤;
  3. 若事務更新語句一次僅涉及一個分區,死鎖的行存在於一個分區,那麼死鎖過程會立即被檢測出來,多個事務的死鎖更新,僅有一個被保留,其它事務將被立即回滾,由於事務更新曆史中存在跨分區的可能,因此分布式數據庫將強行鎖定所有未通過mysql死鎖檢測且被清除的事務,強製用戶隻能進行rollback而不得進行其它任何操作,對於那個通過mysql死鎖檢測的事務,後續的操作與普通事務相同,分布式數據庫將向用戶返回死鎖錯誤,後續非rollback語句將向用戶返回僅支持rollback錯誤;
  4. 若事務更新語句一次涉及多個分區,死鎖的行存在於兩個分區,那麼死鎖過程不會立即被檢測出來,多個事務的死鎖更新會請求鎖,直到鎖超時,然後由mysql通知更新error,這個error結果不會令分區退出事務狀態,後續的操作與普通事務相同,分布式數據庫將向用戶返回數據不一致錯誤;
  5. 若事務更新語句一次涉及多個分區,死鎖的行存在於一個分區,那麼死鎖過程會立即被檢測出來,多個事務的死鎖更新,僅有一個被保留,其它事務將被立即回滾,由於事務更新曆史中存在跨分區的可能,因此分布式數據庫將強行鎖定所有未通過mysql死鎖檢測且被清除的事務,強製用戶隻能進行rollback而不得進行其它任何操作,對於那個通過mysql死鎖檢測的事務,後續的操作與普通事務相同,分布式數據庫將向用戶返回數據不一致錯誤,後續非rollback語句將向用戶返回僅支持rollback錯誤;

最後更新:2016-11-23 17:16:03

  上一篇:go DML語法__用戶指南_雲數據庫 PetaData-阿裏雲
  下一篇:go 其他語句說明__用戶指南_雲數據庫 PetaData-阿裏雲