MySQL_TCL事務

# TCL
/*
transaction control language 事務控制語言

事務:
一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。

事務由單獨單元的一個或多個sql語句組成,在這個單元中,每個MySQL語句是相互依賴的。
而整個單獨單元作爲一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾。
所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,
則事物被順利執行。

案例:轉賬
張三丰 1000 給郭襄

update 表 set 張三丰的餘額=500 where name='張三丰'
意外
update 表 set 郭襄的餘額=1500 where name='郭襄'


事物的屬性(特點ACID):
1.原子性(atomicity):原子性是指事物是一個不可分割的工作單位,
事務中的操作要麼都發生,要麼都不發生。
2.一致性(consistency):
事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態
3.隔離性(isolation):
事務的隔離性是指一個事務的執行不能被其他事務干擾,
即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,
併發執行的各個事務之間不能互相干擾
4.持久性(durability):
持久性是指一個事務一旦被提交,它對數據庫中的數據的改變就是永久性的,
接下來的其他操作和數據庫故障不應該對其有任何影響。

事務的創建:
隱式事務:事務沒有明顯的開啓和結束的標記
比如insert、update、delete語句

例:delete from 表 where 條件篩選;

顯示事務:事務具有明顯的開啓和結束的標記
前提:必須先設置自動提交功能爲禁用
set autocommit=0;

步驟1:開啓事務
set autocommit=0;
start transaction; # 可選的
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
...

步驟3:結束事務
commit; # 提交事務
rollback; # 回滾事務

savepoint 節點名;  # 設置保存點

*/

SHOW VARIABLES LIKE 'autocommit';


# 案例
DROP TABLE IF EXISTS account;

CREATE TABLE account(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	balance DOUBLE
);

INSERT INTO account(username,balance)
VALUES('張無忌',1000),('趙敏',1000);

# 開啓事務
SET autocommit=0;
START TRANSACTION;
# 編寫一組事務的語句
UPDATE account SET balance=500 WHERE username='張無忌';
UPDATE account SET balance=1500 WHERE username='趙敏';
# 結束事務
COMMIT;

# 開啓事務
SET autocommit=0;
START TRANSACTION;
# 編寫一組事務的語句
UPDATE account SET balance=1000 WHERE username='張無忌';
UPDATE account SET balance=1000 WHERE username='趙敏';
# 結束事務
ROLLBACK;

SELECT * FROM account;

/*
對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,
如果沒有采取必要的隔離機制,就會導致各種併發問題:
	
	髒讀:對於兩個事務T1、T2,T1讀取了已經被T2更新但還沒有被提交的字段
	之後,若T2回滾,T1讀取的內容就是臨時且無效的。
	
	不可重複讀:對於兩個事務T1、T2,T1讀取了一個字段,然後T2更新了該字段
	之後,T1再次讀取同一個字段,值就不同了
	
	幻讀:對於兩個事務T1、T2,T1從一個表中讀取了一個字段,
	然後T2在該表中插入了一些新的行之後,如果T1再次讀取同一個表,就會多出幾行
	
數據庫事務的隔離性:數據庫系統必須具有隔離併發運行各個事務的能力,
使它們不會相互影響,避免各種併發問題。
*/
/*
隔離級別:
				髒讀	不可重複讀	幻讀
read uncommitted(讀未提交數據)	√	√		√
read committed(讀已提交數據)	×	√		√
repeatable read(可重複讀)	×	×		√
serializable(串行化)		×	×		×

*/


SELECT @@tx_isolation; # 查看當前隔離級別,默認爲repeatable-read(可重複度)

# 設置當前MySQL連接的隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

# 設置數據庫系統的全局隔離級別 SET GLOBAL SESSION TRANSACTION ISOLATION LEVEL

# 2.delete和truncate在事務使用時的區別

# 演示delete

SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;

# 演示truncate

SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;

# 3.演示savepoint的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a; # 設置保存點
DELETE FROM account WHERE id=28;
ROLLBACK TO a; # 回滾 到保存點

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