4.6 事務_基本介紹
- 事務: 如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
- 如: 轉賬,往往是要多次通路資料庫才能完成的。轉賬是一個使用者扣錢,另一個使用者加錢。如果其中有一條 SQL 語句出現異常,這條 SQL 就可能執行失敗。
- 操作:
- 1.開啟事務:
start transaction;
- 2.復原:
rollback;
- 3.送出:
commit;
- 1.開啟事務:
- 示例:
-- 建立資料表
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加資料
INSERT INTO account (NAME, balance) VALUES ('張三', 1000), ('李四', 1000);
/*
模拟張三給李四轉 500 元錢,一個轉賬的業務操作最少要執行下面的 2 條語句:
張三賬号-500
李四賬号+500
*/
-- 手動送出:
-- 0. 開啟事務
START TRANSACTION;
-- 1. 張三賬戶 -500
UPDATE account SET balance = balance - 500 WHERE NAME = '張三';
-- 2. 李四賬戶 +500
UPDATE account SET balance = balance + 500 WHERE NAME = '李四';
-- 3.發現執行沒有問題,送出事務
COMMIT;
-- 發現出問題了,復原事務
ROLLBACK;
4.7 事務_自動送出與手動送出
- 事務送出的兩種方式:
- 自動送出
- mysql就是自動送出的;
- 一條DML(增删改)語句會自動送出一次事務。
- 手動送出:
- Oracle 資料庫預設是手動送出事務;
- 需要先開啟事務,再送出.
- 自動送出
- 修改事務的預設送出方式:
- 檢視事務的預設送出方式:
SELECT @@autocommit; -- 1 代表自動送出 0 代表手動送出
- 修改預設送出方式:
set @@autocommit = 0;
- 檢視事務的預設送出方式:
4.8 事務_事物的四大特征
- 事務的四大特征:
- 1.原子性: 是不可分割的最小操作機關,要麼同時成功,要麼同時失敗。
- 2.持久性: 當事務送出或復原後,資料庫會持久化的儲存資料。
- 3.隔離性: 多個事務之間。互相獨立。
- 4.一緻性: 事務操作前後,資料總量不變.
4.9 事務_事務的隔離級别
- 概念: 多個事務之間隔離的,互相獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級别就可以解決這些問題。
- 存在問題:
- 髒讀: 一個事務,讀取到另一個事務中沒有送出的資料。
- 不可重複讀(虛讀): 在同一個事務中,兩次讀取到的資料不一樣。
- 幻讀: 一個事務操作(DML)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。
- 隔離級别:
- read uncommitted :讀未送出
- 産生的問題: 髒讀、不可重複讀、幻讀
- read committed: 讀已送出 (Oracle)
- 産生的問題: 不可重複讀、幻讀
- repeatable read: 可重複讀 (MySQL預設)
- 産生的問題: 幻讀
- serializable: 串行化
- 可以解決所有的問題
- read uncommitted :讀未送出
- notes:
- 隔離級别從小到大安全性越來越高,但是效率越來越低
- 資料庫查詢隔離級别:
select @@tx_isolation;
- 資料庫設定隔離級别:
set global transaction isolation level 級别字元串; -- 需要重新開啟連接配接,才能生效