更新時間:2018-09-17 來源:黑馬程序員JavaEE培訓學院 瀏覽量:
1. 事務的基本介紹
1. 概念:
* 如果一個包含多個步驟的業(yè)務操作,被事務管理,那么這些操作要么同時成功,要么同時失敗。
2. 操作:
1. 開啟事務: start transaction;
2. 回滾:rollback;
3. 提交:commit;
3. 例子:
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加數(shù)據
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
SELECT * FROM account;
UPDATE account SET balance = 1000;
-- 張三給李四轉賬 500 元
-- 0. 開啟事務
START TRANSACTION;
-- 1. 張三賬戶 -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. 李四賬戶 +500
-- 出錯了...
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
-- 發(fā)現(xiàn)執(zhí)行沒有問題,提交事務
COMMIT;
-- 發(fā)現(xiàn)出問題了,回滾事務
ROLLBACK;
4. MySQL數(shù)據庫中事務默認自動提交
* 事務提交的兩種方式:
* 自動提交:
* mysql就是自動提交的
* 一條DML(增刪改)語句會自動提交一次事務。
* 手動提交:
* Oracle 數(shù)據庫默認是手動提交事務
* 需要先開啟事務,再提交
* 修改事務的默認提交方式:
* 查看事務的默認提交方式:SELECT @@autocommit; -- 1 代表自動提交 0 代表手動提交
* 修改默認提交方式: set @@autocommit = 0;
2. 事務的四大特征:
1. 原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗。
2. 持久性:當事務提交或回滾后,數(shù)據庫會持久化的保存數(shù)據。
3. 隔離性:多個事務之間。相互獨立。
4. 一致性:事務操作前后,數(shù)據總量不變
3. 事務的隔離級別(了解)
* 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數(shù)據,則會引發(fā)一些問題,設置不同的隔離級別就可以解決這些問題。
* 存在問題:
1. 臟讀:一個事務,讀取到另一個事務中沒有提交的數(shù)據
2. 不可重復讀(虛讀):在同一個事務中,兩次讀取到的數(shù)據不一樣。
3. 幻讀:一個事務操作(DML)數(shù)據表中所有記錄,另一個事務添加了一條數(shù)據,則第一個事務查詢不到自己的修改。
* 隔離級別:
1. read uncommitted:讀未提交
* 產生的問題:臟讀、不可重復讀、幻讀
2. read committed:讀已提交 (Oracle)
* 產生的問題:不可重復讀、幻讀
3. repeatable read:可重復讀 (MySQL默認)
* 產生的問題:幻讀
4. serializable:串行化
* 可以解決所有的問題
* 注意:隔離級別從小到大安全性越來越高,但是效率越來越低
* 數(shù)據庫查詢隔離級別:
* select @@tx_isolation;
* 數(shù)據庫設置隔離級別:
* set global transaction isolation level 級別字符串;
* 演示:
set global transaction isolation level read uncommitted;
start transaction;
-- 轉賬操作
update account set balance = balance - 500 where id = 1;
update account set balance = balance + 500 where id = 2;
本文版權歸黑馬程序員JavaEE學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
首發(fā):http://java.itheima.com/