1. 程式人生 > >MySQL分散式(XA)事務

MySQL分散式(XA)事務

本文內容來自《高效能MySQL》,自己整理了一下。

  儲存引擎的事務特效能夠保證在儲存引擎級別實現ACID。而分散式事務則讓儲存引擎級別的ACID可以擴充套件到資料庫層面,甚至可以擴充套件到多個數據庫之間--這需要兩階段提交實現。MySQL5.0和更新版本的資料庫已經開始支援XA事務了。

  XA事務中需要有一個事務協調器來保證所有的事務參與者都完成了準備工作(第一階段)。如果協調器收到所有的參與者都準備好的訊息,就會告訴所有的事務可以提交了,這是第二階段。MySQL在這個XA事務過程中扮演一個參與者的角色,而不是協調者。

  實際上,在MySQL中有兩種XA事務。一方面,MySQL可以參與到外部的分散式事務中,另一方面,還可以通過XA事務來協調儲存引擎和二進位制日誌。

內部XA事務

  MySQL本身的外掛式架構導致在其內部需要使用XA事務。MySQL中各個儲存引擎是完全獨立的,彼此不知道對方的存在,所以一個跨儲存引擎的事務就需要一個外部的協調者。如果不使用XA協議,例如,跨儲存引擎的事務提交就只是順序地要求每個儲存引擎各自提交。如果在某個儲存提交過程中發生系統崩潰,就會破壞事務的特性(要麼就全部提交,要麼就不做任何操作)。如果將MySQL記錄的二進位制日誌操作看作一個獨立的“儲存引擎”,就不難理解為什麼即使是一個儲存引擎參與的事務仍然需要XA事務了。在儲存引擎提交的同時,需要將“提交”的資訊寫入二進位制日誌,這就是一個分散式事務,只不過二進位制日誌的參與者是MySQL本身。

  XA事務為MySQL帶來巨大的效能下降。從MySQL5.0開始,它破壞了MySQL內部的“批量提交”(一種通過單磁碟I/O操作完成多個事務提交的技術),使得MySQL不得不進行多次額外的fsync()呼叫。具體的,一個事務如果開啟了二進位制日誌,則不僅需要對二進位制日誌進行持久化操作,InnoDB事務日誌還需要兩次日誌持久化操作。換句話說,如果希望有二進位制日誌安全的事務實現,則至少需要做三次fsync()操作。唯一避免這個問題的辦法就是關閉二進位制日誌,並將innodb_support_xa設定為0。

  但是這樣的設定是非常不安全的,而且這會導致MySQL複製也沒法正常工作。複製需要二進位制日誌和XA事務的支援,另外--如果希望資料儘可能安全--最好還要講sync--binlog設定為1,這時儲存引擎和二進位制日誌才是真正同步的。(否則,XA事務支援就沒有意義了,因為事務提交了二進位制日誌卻可能沒有“提交”到磁碟。)這也是為什麼我們強烈建議使用帶電池保護的RAID卡寫快取:這個快取可以大大加快fsync()操作的效率。

外部XA事務

  MySQL能夠作為參與者完成一個外部的分散式事務。但它對XA協議支援並不完整,例如,XA協議要求在一個事務中的多個連線可以做關聯,但目前的MySQL版本還不能支援。

  因為通訊延遲和參與者本身可能失敗,所以外部XA事務比內部消耗會更大。如果在廣域網中使用XA事務,通常會因為不可預測的網路效能導致事務失敗。如果有太多不可控因素,例如,不穩定的網路通訊或者使用者長時間地等待而不提交,則最好避免使用XA事務。任何可能讓事務提交發生延遲的操作代價都很大,因為它影響的不僅僅是自己本身,它還會讓所有參與者都在等待。

  別的方式實現分散式事務:可以在本地寫入資料,並將其放入佇列,然後在一個更小、更快的事務中自動分發。還可以使用MySQL本身的複製機制來發送資料。

  XA事務是一種在多個伺服器之間同步資料的方法。如果由於某些原因不能使用MySQL本身的複製,或者效能並不是瓶頸的時候,可以嘗試使用。

相關推薦

MySQL分散式XA事務

本文內容來自《高效能MySQL》,自己整理了一下。   儲存引擎的事務特效能夠保證在儲存引擎級別實現ACID。而分散式事務則讓儲存引擎級別的ACID可以擴充套件到資料庫層面,甚至可以擴充套件到多個數據庫之間--這需要兩階段提交實現。MySQL5.0和更新版本的資料庫已經開

MySQL筆記7-- 事務和實現

一、背景   前面有說到InnoDB是事務型引擎,那什麼是事務?事務的特性是什麼?它所對應的隔離級別是哪些?是怎麼實現的?下面來詳細討論下。 二、事務的理解   事務就是一組原子性的SQL查詢,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料庫應用該組查詢的全部語句,那麼就執行該組語句。如果其中有任何

php + mysql 分散式事務xa

這是寫的一個測試分散式事務的指令碼,參考了網上的一個指令碼,但是那個在我這裡指令碼不能正常執行,就自己改了一下 <?php $mapfarm = new mysqli("10.128.51.121","public","public","db1")or die("$mapfarm : 連線失敗"); $

mysql基礎mysql事務

mysqlmysql事務:是一個獨立的工作單元 事務必須通過ACID測試: 原子性(Atomicity):一個事務的所有操作要麽全部成功執行,要麽全部失敗後回滾 一致性(Consistency):數據庫總是從一個一致性狀態轉換成另一個狀態 隔離性(Isolation):一個事務在做出

MYSQL學習筆記4事務的開啟、提交、回滾

mysql 事務 使用事務要註意以下三點:1、在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。2、事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麽全部執行,要麽全部不執行。3、事務用來管理 insert,update,delete 語句MYSQL 事務處理

MySQL數據庫高級——事務和鎖

MySQL 事務 鎖MySQL數據庫高級(七)——事務和鎖 一、事務簡介 1、事務簡介 事務(Transaction) 是指作為單個邏輯工作單元執行的一系列操作。 2、事務的特性 A、原子性(Atomicity)表示組成一個事務的多個數據庫操作是一個不可分隔的原子單元,只有所有的操作執行成功,整個事務才提交,

分散式事務 解決資料一致性事務原則與實現:事務、sql事務

事務: 定義:       是以一種可靠、一致的方式,訪問和操作資料庫中資料的程式單元。 原則:      *a、 原子性   * b、一致性  * c、隔離性 &nbs

mysql 命令列處理事務

mysql中,事務是一些資料庫操作語句,有3個特點: 1.只有使用了InnoD引擎的資料庫或者表支援事務 2.事務可以用來維護資料庫完整性,保證成批的sql語句要麼全執行,要麼全不執行,不會出現部分執行失敗導致不一致的情況 3.事務用來管理insert,update,d

分散式事務事務的隔離級別

事務的ACID **Atomic:**原子性,一堆SQL,要麼都成功,要麼都不執行,不允許一部分SQL執行成功,一部分SQL執行失敗。 **Consistency:**一致性,在一堆SQL執行之前,資料必須是正確的,執行之後,資料也必須是準確的。 **Isolation:**隔離

Mysql事務詳解事務的概念,四大特性,使用和回滾

以往的時候在java中,下面一個語句就可以操作一條資料庫語句<span style="font-family: Arial, Helvetica, sans-serif;">Class.forName("com.mysql.jdbc.Driver");//載入相

MySQL基礎9——遊標、觸發器和事務處理

本篇主要整理如何使用遊標、觸發器以及管理事務處理的相關內容。 本篇內容 適用於MySQL 5及以後的版本。 一、遊標 遊標:是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT

MySQL學習MySQL鎖與事務

本章我們著重討論MySQL鎖機制的特點,常見的鎖問題,以及解決MySQL鎖問題的一些方法或建議。 一、MySQL鎖概述 相對其他資料庫而言,MySQL的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。比如,MyISAM和MEMORY儲存引擎採用的

MySQL 筆記整理2 --事務隔離,為什麽你改了我還看不見?

ble 優勢 控制 nod 讀寫 為什麽 數據操作 src 保持 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 3) --事務隔離,為什麽你改了我還看不見?   簡單來說,事務就是要保證一組數據操作,要麽全部成功,要麽全部失敗。在MySQL中,事務支持是在引擎

MySQL 入門3事務隔離

## 摘要 在這一篇內容中,我將從事務是什麼開始,聊一聊事務的必要性。 然後,介紹一下在InnoDB中,四種不同級別的事務隔離,能解決什麼問題,以及會帶來什麼問題。 最後,我會介紹一下InnoDB解決高併發事務的方式:多版本併發控制。 ## 1 什麼是事務 說到事務,一個最典型的例子就是

Spring事務專題事務的基本概念,Mysql事務處理原理

# 前言 本專題大綱: ![專欄大綱](https://gitee.com/wx_cc347be696/blogImage/raw/master/image-20200725231232778.png) 我重新整理了大綱,思考了很久,決定單獨將MySQL的事務實現原理跟Spring中的事務示例分為兩篇文

MySQL事務事務隔離的實現原理:一致性讀

今天我們來學習一下MySQL的事務隔離是如何實現的。如果你對事務以及事務隔離級別還不太瞭解的話,這裡[左轉](https://www.cnblogs.com/liang24/p/14111897.html)。 好的,下面正式進入主題。事務隔離級別有4種:讀未提交、讀提交、可重複讀和序列化。首先我們來說一下讀

MySQL學習ODBC 安裝

oca local new cmd 密碼 服務 關閉 mysql 系統 寫前說明 初次接觸MySQL,都說MySQL各種好。我也來學習學習。之前只有SQLServer2008的經驗,其實也只是皮毛。因為SQLServer還是比較容易上手的。也不麻煩。但是自己

Redis 小白指南- 事務、過期、消息通知、管道和優化內存空間

如何 入門 系列 code 場景 消息 運算 封裝 c# Redis 小白指南(三)- 事務、過期、消息通知、管道和優化內存空間 簡介   《Redis 小白指南(一)- 簡介、安裝、GUI 和 C# 驅動介紹》 講的是 Redis 的介紹,以及如何在 Windows

mysql基礎存儲引擎和鎖

mysql存儲引擎的概念: 關系型數據庫表是用於存儲和組織信息的數據結構,可以將表理解為由行和列組成的表格,各種各樣,不同的表結構意味著存儲不同類型的數據,在數據的處理上也會存在著差異,對於mysql來說,它提供了多種類型的存儲引擎,可以根據對數據處理的需求,選擇不同的存儲引擎,從而最大

mysql基礎用戶權限管理和root密碼恢復

mysqlmysql用戶由用戶和主機名組成,[email protected]/* */,mysql的用戶和權限信息存儲在mysql庫中 mysql數據庫表: user #用戶賬號、全局權限 db #庫級別權限 host #主機 tables_priv