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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章