1. 程式人生 > 其它 >SQL事務詳解

SQL事務詳解

技術標籤:SQLsql資料庫mysql

#TCL

/*
Transaction Control Language 事務控制語言

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

案例:轉賬

張三丰 1000
郭襄 1000

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

事務的特性:
ACID
原子性:一個事務不可再分割,要麼都執行要麼都不執行
一致性:一個事務執行會使資料從一個一致狀態切換到另外一個一致狀態
隔離性:一個事務的執行不受其他事務的干擾
永續性:一個事務一旦提交,則會永久的改變資料庫的資料.

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

delete from 表 where id =1;

顯式事務:事務具有明顯的開啟和結束的標記
前提:必須先設定自動提交功能為禁用

set autocommit=0;

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

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

savepoint 節點名;設定儲存點

髒讀:		一個事務讀取了其他事務還沒有提交的資料,讀到的是其他事務“更新”的資料
不可重複讀:	一個事務多次讀取,結果不一樣
幻讀:		一個事務讀取了其他事務還沒有提交的資料,只是讀到的是 其他事務“插入”的資料

==
對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒 有采取必要的隔離機制, 就會導致各種併發問題==: 1、髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還 沒有被提交的欄位. 之後,T2 回滾, T1讀取的內容就是臨時且無效的. 2、不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了. 3、幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中 插 入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力, 使它們不會相互影響, 避免各種併發問題. 一個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔 離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就 越好, 但併發性越弱.

事務的隔離級別

		  事務的隔離級別:
								髒讀		不可重複讀	幻讀
讀未提交  read uncommitted:		√			√			√ 		
讀已提交  read committed:  		×			√			√	可以避免髒讀
可重複讀  repeatable read: 		×			×			√	可以避免髒讀、不可重複讀和一部分幻讀
序列化    serializable	  		×           ×           ×	可以避免髒讀、不可重複讀和幻讀

mysql中預設 第三個隔離級別 repeatable read
oracle中預設第二個隔離級別 read committed
Oracle 支援的 2 種事務隔離級別:READ COMMITED,SERIALIZABLE.
Mysql 支援 4 種事務隔離級別.

檢視隔離級別
select @@tx_isolation;
設定隔離級別 session:當前 global :全域性
set session|global transaction isolation level 隔離級別;

開啟事務的語句;
update 表 set 張三丰的餘額=500 where name=‘張三丰’

update 表 set 郭襄的餘額=1500 where name=‘郭襄’
結束事務的語句;

*/


```javascript

```javascript
SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES; #來檢視mysql支援的儲存引擎。
			  #其中innodb支援事務,而myisam、memory等不支援事務

#1.演示事務的使用步驟

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

#結束事務
ROLLBACK;
#commit;

SELECT * FROM account;


#2.演示事務對於delete和truncate的處理的區別

SET autocommit=0;
START TRANSACTION;

DELETE FROM 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;