Springmvc ViewResolver設計實現過程解析
一、事務
1、定義:Transaction Control Language 事務控制語言
一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。
在mysql中用的最多的儲存引擎有:innodb,myisam,memory等,但只有使用了Innodb資料庫引擎的資料庫或表才支援事務
2、事務的特性:ACID
原子性:事務是最小單位,一個事務不可再分割
一致性:一個事務執行會使資料從一個一致狀態切換到另外一個一致狀態
隔離性:一個事務的執行不受其他事務的干擾
永續性:一個事務一旦提交,則會永久的改變資料庫的資料.
3、事務的建立
1)隱式事務:事務沒有明顯的開啟和結束的標記;比如insert、update、delete語句
2)顯式事務:事務具有明顯的開啟和結束的標記;
前提:必須先設定自動提交功能為禁用,set autocommit=0;
3)操作步驟
步驟1:開啟事務
set autocommit=0;(只針對當前會話有效)
start transaction;可選的
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
...
步驟3:結束事務
commit;提交事務
rollback;回滾事務
savepoint 節點名;設定儲存點(類似設定斷點)
4、演示事務的使用步驟
#開啟事務
SET autocommit=0;
START TRANSACTION;
#編寫一組事務的語句
UPDATE account SET balance = 1000 WHERE username='張無忌';
UPDATE account SET balance = 1000 WHERE username='趙敏';
#結束事務
ROLLBACK;
# commit;
#演示savepoint的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#設定儲存點
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滾到儲存點(第二條未被刪除)
5、事務併發問題
對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有采取必要的隔離機制, 就會導致各種併發問題:
1)髒讀: 對於兩個事務T1, T2, T1 讀取了已經被T2 更新但還沒有被提交的欄位. 之後, 若T2 回滾, T1讀取的內容就是臨時且無效的.
2)不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個欄位, 然後T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.
3)幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個欄位, 然後T2 在該表中插入了一些新的行. 之後, 如果T1 再次讀取同一個表, 就會多出幾行.
6、事務的隔離級別
資料庫系統必須具有隔離併發執行各個事務的能力, 使它們不會相互影響, 避免各種併發問題;
一個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就越好, 但併發性越弱.
1)每啟動一個mysql 程式, 就會獲得一個單獨的資料庫連線. 每個資料庫連線都有一個全域性變數@@tx_isolation, 表示當前的事務隔離級別.
檢視當前的隔離級別: SELECT @@tx_isolation;
2)設定當前mySQL 連線的隔離級別:
set transaction isolation level read committed;
3)設定資料庫系統的全域性的隔離級別:
set globaltransaction isolation level read committed;
4)mysql中預設第三個隔離級別 repeatable read
oracle中預設第二個隔離級別 read committed
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | |
read uncommitted(讀未提交資料) | √ | √ | √ | 允許事務讀取未被其他事物提交的變更,髒讀、不可重複讀和幻讀的問題都會出現 |
read committed(讀已提交資料) | × | √ | √ | 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍可能出現 |
repeatable read(可重複讀) | × | × | √ | 確保事務可以多次從一個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個欄位進行更新,可以避免髒讀和不可重複讀,但幻讀的問題仍存在 |
serializable(序列化) | × | × | × | 確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入、更新和刪除操作,所有併發問題都可以避免,但效能是否低下 |