深入理解PHP Mysql分布式事務與解決方案

2021-10-12 02:24:58 字數 3624 閱讀 8506

事務(transaction)是訪問並可能更新資料庫中各種資料項的乙個程式執行單元;

事務的acid特性

事務應該具有4個屬性:原子性、一致性、隔離性、持續性

原子性(atomicity)。乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

一致性(consistency)。事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。乙個事務的執行不能被其他事務干擾。即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

永續性(durability)。持續性也稱永久性(permanence),指乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

分布式事務:分布式事務的參與者、資源管理器、事務管理器等位於不用的節點上,這些不同的節點相互協作共同完成乙個具有邏輯完整性的事務。

mysql從5.0開始支援xa datasource。connector/j 版本要使用5.0版本,5.0以下的不支援。

常見的分布式事務解決方案

基於xa協議的兩階段提交

xa協議由tuxedo首先提出的,並交給x/open組織,作為資源管理器(資料庫)與事務管理器的介面標準。目前,oracle、informix、db2和sybase等各大資料庫廠家都提供對xa的支援。xa協議採用兩階段提交方式來管理分布式事務。xa介面提供資源管理器與事務管理器之間進行通訊的標準介面。xa協議包括兩套函式,以xa_開頭的及以ax_開頭的。

以下的函式使事務管理器可以對資源管理器進行的操作:

1)xa_open,xa_close:建立和關閉與資源管理器的連線。

2)xa_start,xa_end:開始和結束乙個本地事務。

3)xa_prepare,xa_commit,xa_rollback:預提交、提交和回滾乙個本地事務。

4)xa_recover:回滾乙個已進行預提交的事務。

5)ax_開頭的函式使資源管理器可以動態地在事務管理器中進行註冊,並可以對xid(transaction ids)進行操作。

6)ax_reg,ax_unreg;允許乙個資源管理器在乙個tms(transaction manager server)中動態註冊或撤消註冊。

xa實現分布式事務的原理如下:

在這裡插入描述

在這裡插入描述

mysql xa分為兩類,內部xa與外部xa;內部xa用於同一例項下跨多個引擎的事務,由大家熟悉的binlog作為協調者;外部xa用於跨多mysql例項的分 布式事務,需要應用層介入作為協調者(崩潰時的懸掛事務,全域性提交還是回滾,需要由應用層決定,對應用層的實現要求較高);

binlog作為內部xa的協調者,在binlog**現的內部xid,在crash recover時,由binlog負責提交。(這是因為,binlog不進行prepare, 只進行commit,因此在binlog**現的內部xid,一定能夠保證其在底層各儲存引擎中已經完成prepare)。

mysql資料庫外部xa可以用在分布式資料庫**層,實現對mysql資料庫的分布式事務支援,例如開源的**工具:網易的ddb,**的tddl,b2b的cobar等等。

示例 hi

s−

>te

st

−>cr

eate

orde

r(

this->test->createorder(

this

−>te

st−>cr

eate

orde

r(goods_id,goo

dsna

me

,goods_name,

goodsn

​ame

,num);

$rs_goods = thi

s−

>te

st

−>de

duct

ion(

this->test->deduction(

this

−>te

st−>de

duct

ion(

goods_id,num

);if

(num); if(

num);i

f(rs_order[『status』] 「success」 && $rs_goods[『status』]「success」)else

print_r($rs_order);

echo "

"; print_r($rs_goods);

die("dddd");

}public function createorder($goods_id,$goods_name,$num)else

} catch (exception $e)

$this->_db->query("xa end '$xa'");

if($_rs)else

} public function deduction($id)else

}else

} catch (exception $e)

$this->db1->query("xa end '$xa'");

if($last_rs)else

}//提交事務!

public function commitdb($xa)

//回滾事務

public function rollbackdb($xa)

//提交事務!

public function commitdb1($xa)

//回滾事務

public function rollbackdb1($xa)

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

94總結

分布式事務,本質上是對多個資料庫的事務進行統一控制,按照控制力度可以分為:不控制、部分控制和完全控制。不控制就是不引入分布式事務,部分控制就是各種變種的兩階段提交,包括上面提到的訊息事務+最終一致性、tcc模式,而完全控制就是完全實現兩階段提交。部分控制的好處是併發量和效能很好,缺點是資料一致性減弱了,完全控制則是犧牲了效能,保障了一致性,具體用哪種方式,最終還是取決於業務場景。作為技術人員,一定不能忘了技術是為業務服務的,不要為了技術而技術,針對不同業務進行技術選型也是一種很重要的能力

深入理解分布式事務

碼農網 吳極心 當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的乙個資料庫變成了多個資料庫。這時候,如果乙個操作既訪問01庫,又訪問02庫,而且要保證資料的一致性,那麼就要用到分布式事務。所謂的soa化,就是業務的服務...

深入理解分布式事務

當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的乙個資料庫變成了多個資料庫。這時候,如果乙個操作既訪問01庫,又訪問02庫,而且要保證資料的一致性,那麼就要用到分布式事務。所謂的soa化,就是業務的服務化。比如原來單機...

深入理解分布式事務

我在上一期介紹了spring的事務原理 詳情見 深入理解spring事務原理 spring事務 本質是單機下的事務,是由資料庫本身保證的。今天,我將介紹一種比較複雜的事務 分布式事務 當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單...