事務的概念
●事務是一種機制、一個操作序列,包含了一組數據庫操作命令,并且把所有的命令作為一個整體
一起向系統提交或撤銷操作請求,即這一組數據庫命令要么都執行,要么都不執行。
●事務是一個不可分割的工作邏輯單元,在數據庫系統上執行并發操作時,事務是最小的控制單
元。
●事務適用于多用戶同時操作的數據庫系統的場景,如銀行、保險公司及證券交易系統等等。
●事務通過事務的整體性以保證數據的一致性。
●事務能夠提高在向表中更新和插入信息期間的可靠性。
說白了,所謂事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割
的工作單位。
事務的ACID特點
ACID,是指在可靠數據庫管理系統(DBMS)中,事務(transaction)應該具有的四個特性:原子性
(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。這是可靠
數據庫所應具備的幾個特性。
●原子性:指事務是一個不可再分割的工作單位,事務中的操作要么都發生,要么都不發生。
????????事務是一個完整的操作,事務的各元素是不可分的。
????????事務中的所有元素必須作為一個整體提交或回滾。
????????如果事務中的任何元素失敗,則整個事務將失敗。
●一致性:指在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
????????當事務完成時,數據必須處于一致狀態。
????????在事務開始前,數據庫中存儲的數據處于一致狀態。
????????在正在進行的事務中,數據可能處于不一致的狀態。
????????當事務成功完成時,數據必須再次回到已知的一致狀態。
●隔離性:指在并發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據
空間。
????????對數據進行修改的所有并發事務是彼此隔離的,表明事務必須是獨立的,它不應以任何方式依賴于或影響其他事務。
????????修改數據的事務可在另一個使用相同數據的事務開始之前訪問這些數據,或者在另一個使用相同數據的事務結束之后訪問這些數據。
????????也就是說并發訪問數據庫時,一個用戶的事務不被其他事務所干擾,各并發事務之間數據庫是獨立的。
當多個客戶端并發地訪問同一個表時,可能出現下面的一致性問題:
臟讀:當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫
????????中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。
不可重復讀:指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務
也訪問該同一數據。那么,在第一個事務中的兩次讀數據之間,由于第二個事務的修改,那么第一
個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣
的,因此稱為是不可重復讀。(即不能讀到相同的數據內容)
幻讀:一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,
另一個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,操作前一個事務的
用戶會發現表中還有一個沒有修改的數據行,就好象發生了幻覺一樣。
丟失更新:兩個事務同時讀取同一條記錄,A先修改記錄,B也修改記錄(B不知道A修改
過),B提交數據后B的修改結果覆蓋了A的修改結果。
事務的隔離級別決定了事務之間可見的級別。
MySQL事務支持如下四種隔離,用以控制事務所做的修改,并將修改通告至其它并發的事務:
未提交讀(Read Uncommitted(RU)):
允許臟讀,即允許一個事務可以看到其他事務未提交的修改。
提交讀(Read Committed(RC)):
允許一個事務只能看到其他事務已經提交的修改,未提交的修改是不可見的。防止臟讀。
可重復讀(Repeatable Read(RR)):---mysql默認的隔離級別
確保如果在一個事務中執行兩次相同的SELECT語句,都能得到相同的結果,不管其他事務是否提
交這些修改。可以防止臟讀和不可重復讀。
串行讀(Serializable):---相當于鎖表
完全串行化的讀,將一個事務與其他事務完全地隔離。每次讀都需要獲得表級共享鎖,讀寫相互都
會阻塞。可以防止臟讀,不可重復讀取和幻讀,(事務串行化)會降低數據庫的效率。
?
mysql默認的事務處理級別是 repeatable read ,而Oracle和SQL Server是 read committed 。
事務隔離級別的作用范圍分為兩種:
● 全局級:對所有的會話有效
● 會話級:只對當前的會話有效
查詢全局事務隔離級別:
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
?
查詢會話事務隔離級別:
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
設置全局事務隔離級別:
set global transaction isolation level read committed;
set @@global.tx_isolation='read-committed'; #重啟服務后失效
●持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被
回滾。
指不管系統是否發生故障,事務處理的結果都是永久的。
一旦事務被提交,事務的效果會被永久地保留在數據庫中。
總結:在事務管理中,原子性是基礎,隔離性是手段,一致性是目的,持久性是結果。
事務控制語句
BEGIN 或 START TRANSACTION:顯式地開啟一個事務。
COMMIT 或 COMMIT WORK:提交事務,并使已對數據庫進行的所有修改變為永久性的。
ROLLBACK 或 ROLLBACK WORK:回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修
改。
SAVEPOINT S1:使用 SAVEPOINT 允許在事務中創建一個回滾點,一個事務中可以有多個
SAVEPOINT;“S1”代表回滾點名稱。
ROLLBACK TO [SAVEPOINT] S1:把事務回滾到標記點。
使用 set 設置控制事務
SET AUTOCOMMIT=0; #禁止自動提交
SET AUTOCOMMIT=1; #開啟自動提交,Mysql默認為1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值