您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Mysql中怎么實現事物隔離,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
MySQL 事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。原生的 MyISAM 引擎就不支持事務。
事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
事務用來管理 insert,update,delete 語句。
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
事物用來管理更新,刪除,插入語句。常用的事物控制語句有:
BEGIN 顯式地開啟一個事務;
COMMIT 會提交事務,并使已對數據庫進行的所有修改成為永久性的;
ROLLBACK 回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
SAVEPOINT identifier,SAVEPOINT 允許在事務中創建一個保存點,一個事務中可以有多個 SAVEPOINT;
RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
ROLLBACK TO identifier 把事務回滾到標記點;
SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE 這四種方式。
常用的事物處理語句:
BEGIN 開始一個事務;
ROLLBACK 事務回滾;
COMMIT 事務確認;
SET AUTOCOMMIT=0 禁止自動提交;
SET AUTOCOMMIT=1 開啟自動提交;
這里注意一點,根據自身項目需要,將AUTOCOMMIT設置為0或1。
回到文章剛開始的問題,在表中出現了一個key具有兩種結果,初步估計是事物隔離的問題。上面簡單介紹了事物,以及事物隔離的四個類別,這里詳細介紹。
當數據庫上有多個事務同時執行的時候,就可能出現臟讀(dirty read)、不可重復讀(non-repeatable read)、幻讀(phantom read)的問題,為了解決這些問題,就有了“隔離級別”的概念。
臟讀:臟讀就是指當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據;
不可重復讀:是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那么,在第一個事務中的兩 次讀數據之間,由于第二個事務的修改,那么第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。
幻讀: 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。 同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象 發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合并到該文檔的主復本時,發現作者已將未編輯的新材料添加到該文檔中。 如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。
在談隔離級別之前,首先要知道,隔離得越嚴實,效率就會越低。因此很多時候,需要在二者之間尋找一個平衡點。SQL標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(serializable ):
讀未提交:一個事務還沒提交時,它做的變更就能被別的事務看到;
讀提交: 一個事務提交之后,它做的變更才會被其他事務看到;
可重復讀:一個事務執行過程中看到的數據,總是跟這個事務在啟動時看到的數據是一致的。當然在可重復讀隔離級別下,未提交變更對其他事務也是不可見的;
串行化:對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行;
因此,查詢寫錯表的事物隔離類型:
mysql> SELECT @@tx_isolation tableName
結果為:
READ-COMMITTED
可以看到,該表的隔離類型為讀提交, 即需要提交后其變化才能被另外的事物看見。造成這種情況出現的問題是兩個結果都在往表里寫入,當其中一個結果中的某個key寫入后沒有提交時,第二個結果也從其中查詢是否可以插入或更新的條件,沒有查詢到,就直接結果插入到表中了,這樣造成了重復性的插入。解決辦法就是兩個結果按照順序進行寫表,寫完第一個,再寫第二個,這樣就不會出現這種問題了。
1、事務的特性:原子性、一致性、隔離性、持久性;
2、多事務同時執行的時候,可能會出現的問題:臟讀、不可重復讀、幻讀;
3、事務隔離級別:讀未提交、讀提交、可重復讀、串行化;
4、不同事務隔離級別的區別:
讀未提交:一個事務還未提交,它所做的變更就可以被別的事務看到;
讀提交:一個事務提交之后,它所做的變更才可以被別的事務看到;
可重復讀:一個事務執行過程中看到的數據是一致的。未提交的更改對其他事務是不可見的;
串行化:對應一個記錄會加讀寫鎖,出現沖突的時候,后訪問的事務必須等前一個事務執行完成才能繼續執行;
5、配置方法:啟動參數transaction-isolation;
6、事務隔離的實現:每條記錄在更新的時候都會同時記錄一條回滾操作。同一條記錄在系統中可以存在多個版本,這就是數據庫的多版本并發控制(MVCC);
7、事務啟動方式:一、顯式啟動事務語句,begin或者start transaction,提交commit,回滾rollback;二、set autocommit=0,該命令會把這個線程的自動提交關掉。這樣只要執行一個select語句,事務就啟動,并不會自動提交,直到主動執行commit或rollback或斷開連接;
8、如果考慮多一次交互問題,可以使用commit work and chain語法。在autocommit=1的情況下用begin顯式啟動事務,如果執行commit則提交事務。如果執行commit work and chain則提交事務并自動啟動下一個事務;
以上就是Mysql中怎么實現事物隔離,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。