一郭蕉、事務(wù)的概述
1.1 概念
保證事務(wù)中的所有操作都作為一個工作單元來執(zhí)行冕象,即使出現(xiàn)了故障荠诬,都不能改變這種執(zhí)行方式凭豪。
當(dāng)在一個事務(wù)中執(zhí)行多個操作時焙蹭,要么所有的事務(wù)都被提交(commit),那么這些修改就永久地保存下來墅诡;要么數(shù)據(jù)庫管理系統(tǒng)將放棄所作的所有修改壳嚎,整個事務(wù)回滾(rollback)到最初狀態(tài)桐智。
1.2 事務(wù)的原理
事務(wù)開啟之后末早,所有的操作都會臨時保存到事務(wù)日志,事務(wù)日志只有在得到commit命令才會同步到數(shù)據(jù)庫表中说庭,其他任何情況都會清空事務(wù)日志(rollback然磷,斷開連接)。
1.3 事務(wù)的使用場景
如果在某個業(yè)務(wù)中需要執(zhí)行多條SQL語句刊驴,這種情況一般是需要使用到事務(wù)姿搜,從而保證多條SQL語句執(zhí)行同時成功或同時失敗。
例如:轉(zhuǎn)賬捆憎、批量刪除舅柜、從購物車中提交訂單等等操作。
1.4 事務(wù)的四大特性(ACID)
1. 原子性
原子性是指事務(wù)是一個不可分割的工作單位躲惰,事務(wù)中的操作要么都發(fā)生致份,要么都不發(fā)生。
2. 一致性
事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)础拨。
3. 隔離性
事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾氮块,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾诡宗。
4. 持久性
持久性是指一個事務(wù)一旦被提交滔蝉,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響塔沃。
二蝠引、MySQL進(jìn)行事務(wù)管理操作
2.1 自動事務(wù)(MySQL默認(rèn))
MySQL默認(rèn)是自動提交事務(wù)的,一條SQL語句就是一個事務(wù)。
2.2 開啟事務(wù)
2.2.1 方式一:手動開啟事務(wù)
START TRANSACTION
手動開啟事務(wù)之后螃概,執(zhí)行的SQL語句都不會真正改變數(shù)據(jù)庫中的數(shù)據(jù)边坤,需要用戶手動提交事務(wù)才能夠真正執(zhí)行SQL語句。
2.2.2 方式二:設(shè)置MySQL中的自動提交參數(shù)
- 1谅年、查看MySQL中事務(wù)是否自動提交
show variables like '%commit%'
- 2茧痒、設(shè)置自動提交的參數(shù)為OFF
set autocommit = 0
2.2.3 提交和回滾事務(wù)
1、提交事務(wù)
當(dāng)事務(wù)中的SQL語句執(zhí)行完畢之后融蹂,沒有出現(xiàn)任何問題旺订,我們需要在最后提交事務(wù),讓這些SQL語句真正執(zhí)行去改變數(shù)據(jù)庫中的數(shù)據(jù)超燃。
commit
2区拳、回滾事務(wù)
當(dāng)執(zhí)行這個事務(wù)中的SQL語句的過程中,一旦出現(xiàn)問題或者異常意乓,則需要回滾事務(wù)樱调,從而回到SQL語句執(zhí)行之前的狀態(tài)。
rollback
三届良、事務(wù)的隔離級別
3.1 不考慮事務(wù)的隔離性會引發(fā)的問題
事務(wù)在操作時的理想狀態(tài)如下:
所有的事務(wù)之間保持隔離笆凌,互不影響。因為并發(fā)操作士葫,多個用戶同時訪問同一個數(shù)據(jù)乞而。可能引發(fā)并發(fā)訪問的問題慢显。
并發(fā)訪問的問題 | 含義 |
---|---|
臟讀 | 一個事務(wù)讀取到了另一個事務(wù)中尚未提交的數(shù)據(jù) |
不可重復(fù)讀 | 一個事務(wù)中兩次讀取的數(shù)據(jù)內(nèi)容不一致爪模,要求的是一個事務(wù)中多次讀取時數(shù)據(jù)是一致的,這是事務(wù)update時引發(fā)的問題 |
幻讀 | 一個事務(wù)中兩次讀取的數(shù)據(jù)的數(shù)量不一致荚藻,要求在一個事務(wù)多次讀取的數(shù)據(jù)的數(shù)量是一致的屋灌,這是insert或delete時引發(fā)的問題 |
3.2 事務(wù)隔離級別
級別 | 名字 | 隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 數(shù)據(jù)庫默認(rèn)隔離級別 |
---|---|---|---|---|---|---|
1 | 讀未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 讀已提交 | read committed | 否 | 是 | 是 | Oracle |
3 | 可重復(fù)度 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 | 最高的隔離級別 |
隔離級別越高,性能(效率)越差应狱,安全性越高共郭。
3.2.1 設(shè)置隔離級別
- 設(shè)置事務(wù)隔離級別
set session transaction isolation level 隔離級別;
- 查詢當(dāng)前事務(wù)隔離級別
select @@tx_isolation