2023年04月25日 10:36:40 唐大麥 閱讀數:13767 標籤: 分布式
mysql
資料庫事務 更多
個人分類: -------【mysql】
在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分布在不同的庫中(庫可能分布在不同的機器上)。在這種場景下,事務的提交會變得相對複雜,因為多個節點(庫)的存在,可能存在部分節點提交失敗的情況,即事務的acid特性需要在各個不同的資料庫例項中保證。比如更新db1庫的a表時,必須同步更新db2庫的b表,兩個更新形成乙個事務,要麼都成功,要麼都失敗。
那麼我們如何利用mysql實現分布式資料庫的事務呢?
mysql 為我們提供了分布式事務解決方案( 這是mysql5.7的文件)
這裡先宣告兩個概念:
mysql在執行分布式事務(外部xa)的時候,mysql伺服器相當於xa事務資源管理器,與mysql鏈結的客戶端相當於事務管理器。
分布式事務通常採用2pc協議,全稱two phase commitment protocol。該協議主要為了解決在分布式資料庫場景下,所有節點間資料一致性的問題。分布式事務通過2pc協議將提交分成兩個階段:
階段一為準備(prepare)階段。即所有的參與者準備執行事務並鎖住需要的資源。參與者ready時,向transaction manager報告已準備就緒。
階段二為提交階段(commit)。當transaction manager確認所有參與者都ready後,向所有參與者傳送commit命令。
如下圖所示:
因為xa 事務是基於兩階段提交協議的,所以需要有乙個事務協調者(transaction manager)來保證所有的事務參與者都完成了準備工作(第一階段)。如果事務協調者(transaction manager)收到所有參與者都準備好的訊息,就會通知所有的事務都可以提交了(第二階段)。mysql 在這個xa事務中扮演的是參與者的角色,而不是事務協調者(transaction manager)。
xa xid [join|resume] 啟動xid事務 (xid 必須是乙個唯一值; 不支援[join|resume]子句)
xa end xid [suspend [for migrate]] 結束xid事務 ( 不支援[suspend [for migrate]] 子句)
xa prepare xid 準備、預提交xid事務
xa commit xid [one phase] 提交xid事務
xa rollback xid 回滾xid事務
xa recover 檢視處於prepare 階段的所有事務
1、首先要確保mysql開啟xa事務支援
show variables like '%xa%'
如果innodb_support_xa的值是on就說明mysql已經開啟對xa事務的支援了。
如果不是就執行:
set innodb_support_xa = on
開啟
2、**如下:
<?php
$dbtest1 = new mysqli("172.20.101.17","public","public","dbtest1")or die("dbtest1 連線失敗");
$dbtest2 = new mysqli("172.20.101.18","public","public","dbtest2")or die("dbtest2 連線失敗");
//為xa事務指定乙個id,xid 必須是乙個唯一值。
$xid = uniqid("");
//兩個庫指定同乙個事務id,表明這兩個庫的操作處於同一事務中
$dbtest1->query("xa start '$xid'");//準備事務1
$dbtest2->query("xa start '$xid'");//準備事務2
try
//$dbtest2
$return = $dbtest2->query("update memberpoints set point=point+10 where memberid=1") ;
if($return == false)
//階段1:$dbtest1提交準備就緒
$dbtest1->query("xa end '$xid'");
$dbtest1->query("xa prepare '$xid'");
//階段1:$dbtest2提交準備就緒
$dbtest2->query("xa end '$xid'");
$dbtest2->query("xa prepare '$xid'");
//階段2:提交兩個庫
$dbtest1->query("xa commit '$xid'");
$dbtest2->query("xa commit '$xid'");
} catch (exception $e)
$dbtest1->close();
$dbtest2->close();
?>
xa的效能很低。乙個資料庫的事務和多個資料庫間的xa事務效能對比可發現,效能差10倍左右。因此要盡量避免xa事務,例如可以將資料寫入本地,用高效能的訊息系統分發資料。或使用資料庫複製等技術。只有在這些都無法實現,且效能不是瓶頸時才應該使用xa。 分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...
分布式之分布式事務
被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...