一:事物的隔離級別
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.2>對當前session修改,在登入mysql客戶端後,執行命令:[mysqld]
transaction-isolation = repeatable-read
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 注意 事務回滾只針對於表記錄的操作 增 刪 改有效 對建立庫 建立表的操作無效背景 你 建行卡 ...