MySQL事務特性及隔離性(transaction)
1:什麼是事務?
一個事務是一個完整的業務邏輯單元,不可再分。
比如:銀行賬戶轉賬,從A賬戶轉到B賬戶10000元,需要執行兩條update語句:
update t_act set balance = balance - 10000 where actno = ‘act-001’;
update t_act set balance = balance + 10000 where actno = ‘act-002’;
以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗。
要想保證以上兩條DML語句同時成功或者同時失敗,那麼就需要使用數據庫的”事務機制”。
2:和事務相關的只有DML語句。(insert delete update)
爲什麼?因爲它們這三個語句都是和數據庫表當中的”數據”相關的。
事務的存在是爲了保證數據的完整性和安全性。
3:假設所有的業務都能使用1條DML語句搞定,還需要事務機制嗎?
不需要事務。
但實際情況不是這樣的,通常一個【業務】需要多條DML語句聯合完成。
4:事務的特性?
事務的四大特性:ACID
A:原子性:事務是最小的工作單元,不可再分。
B:一致性:事務必須保持多條DML語句同時成功或者同時失敗。
C:隔離性:事務A與事務B之間具有隔離。
D:持久性:持久性說的是最終數據必須持久化到硬盤文件中,事務纔算成功的結束。
5:關於事務之間的隔離性
第一級別:讀未提交(read uncommitted)
對方事務還沒有提交,我們當前事務可以讀取到對方未提交的數據。
讀未提交存在髒讀(Dirty Read)現象:表示讀到了髒的數據。
第二級別:讀已提交(read committed)
對方事務提交之後的數據我方可以讀取到。
讀已提交存在的問題是:不可重複讀。
這種隔離級別解決了:髒讀現象沒有了。
第三級別:可重複讀(repeatable read)
這種隔離級別解決了不可重複讀問題。
存在的問題:讀取到數據是幻想。
第四級別:序列化讀/串行化讀(serializable)
解決了所有問題。
效率低,需要事務排隊。
mysql數據庫默認的隔離級別是:可重複讀
Oracle數據庫默認的隔離級別是:讀已提交
6:演示事務
rollback:回滾事務
commit:提交事務
-mysql事務默認情況下是自動提交的。
(什麼是自動提交?只要執行任意一條DML語句則提交一次。)
怎麼關閉自動提交?
start transaction
準備表:
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
userName varchar(255)
);
insert into t_user (userName) values('zs');
演示:使用start transaction; 關閉自動提交機制。
編寫DML語句
使用commit;提交事務
這樣就保證了兩條以上的DML語句同時成功或同時失敗。
7:查看事務的全局隔離級別:
select @@global.tx_isolation;
8:設置隔離級別:
第一級別:set global transaction isolation level read uncommitted;
(意思是:設置全局事務隔離級別爲read uncommitted)
第二級別:set global transaction isolation level read committed;
第三級別:set global transaction isolation level repeatable read;
第四級別:set global transaction isolation level serializable;