php分享十三 mysql事物

2021-09-07 04:03:43 字數 3115 閱讀 1196

一:事物的隔離級別

1:隔離級別的型別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的;

read uncommitted(讀取未提交內容)

read committed(讀取提交內容)

repeatable read(可重讀)【mysql預設的設定】

2:  檢視隔離級別

1> 檢視當前會話隔離級別:

select@@tx_isolation;

2> 檢視當前系統隔離級別:

select@@global.tx_isolation;

3:隔離級別的修改

1> 全域性修改,修改mysql.ini配置檔案,在最後加上

#可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.

[mysqld]

transaction-isolation = repeatable-read

2>對當前session修改,在登入mysql客戶端後,執行命令:

4: 不同隔離級別的特性:

解決辦法:如果只有在修改事務完全提交之後才可以讀取資料,則可以避免該問題。

區別:

不可重複讀的重點是修改:

同樣的條件, 你讀取過的資料,再次讀取出來發現值不一樣了

幻讀的重點在於新增或者刪除

同樣的條件, 第 1 次和第 2 次讀出來的記錄數不一樣

資料庫帶來的併發問題包括:   

1.丟失或覆蓋更新。(幻像讀)

2.未確認的相關性(髒讀)。

3.不一致的分析(非重複讀)。

詳細描述如下:

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。   

e.g.事務a和事務b同時修改某行的值,

1.事務a將數值改為1並提交

2.事務b將數值改為2並提交。

這時資料的值為2,事務a所做的更新將會丟失。

解決辦法:對行加鎖,只允許併發乙個更新事務。

分布式事務:

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

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

分布式事物實現**:

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)中動態註冊或撤消註冊。

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等等。

示例public function testaction()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)

關於mysql裡面的事物 mysql 事物

mysql之事物詳解 一 事務定義 事務 乙個最小的不可再分的工作單元 通常乙個事務對應乙個完整的業務 例如銀行賬戶轉賬業務,該業務就是乙個最小的工作單元 乙個完整的業務需要批量的dml insert update delete 語句共同聯合完成 事務只和dml語句有關,或者說dml語句才有事務。這...

php分享二十 mysql優化

1 垂直分割 示例一 在users表中有乙個欄位是家庭位址,這個欄位是可選字段,相比起,而且你在資料庫操作的時候除了個人資訊外,你並不需要經常讀取或是改寫這個字段。那麼,為什麼不把他放到另外一張表中呢?這樣會讓你的表有更好的效能,大家想想是不是,大量的時候,我對於使用者表來說,只有使用者id,使用者...

MySQL 事物和事物回滾

原子性一致性隔離性永續性 事務應用 開啟事務 mysql begin mysql 一條或者多條sql命令 此時autocommint被禁用終止事務 mysql commit mysql rollback 注意 事務回滾只針對於表記錄的操作 增 刪 改有效 對建立庫 建立表的操作無效背景 你 建行卡 ...