一、事務
事務有ACDI原則
1.原子性(Atomicy)
要麼都成功,要麼都失敗
2. 一致性(Consistency)
事務前後的數據保持一致
3.持久性(Durability) – 事務提交
事務一旦提交不可逆
4.隔離性 (Isolation)
多個人,同時給張三轉錢的時候,每一筆轉賬開啓一個事務,多個事務相互隔離就是隔離性
二、隔離性產生的數據問題
多個用戶都在操作數據產生的數據問題。
1.髒讀 :一個事務讀取了了另一個事務沒有提交的 數據
1.比如張三和李四同時區銀行取相同賬號的錢,此時賬戶上有1000,李四,取錢1000,數據還沒有提交成功
2.張三以迅雷不及掩耳之勢迅速取錢 1000,此時因爲賬戶的數據還沒有來得及修改,於是,張三查詢餘額的時候還是1000.
2.不可重複讀:多次數據讀取的結果不同 (這個不一定是錯誤)
1.你查看 QQ 的信息,第一次刷新,沒有人給你發信息,第二次刷新,出現了一條信息,2次查詢的結果不一致,因爲第一次刷新的對方還沒有提交成功,就是不可重複讀
3.虛讀(幻讀):在一個事務內讀取到了別人插入的數據,導致前後不一致。
和不可重複讀類似,第一次查詢餘額的時候,是1000 元,然後別人充值了1000 元,你第二次查詢的時候就是 2000 元了,
三、事務的案例模擬
1.建表
1.數據庫 事務銀行 tansactionBank
CREATE DATABASE IF NOT EXISTS `transactionBank`CHARACTER SET utf8 COLLATE utf8_general_ci;
2.表 事務銀行 tansactionBank01
CREATE TABLE IF NOT EXISTS `tansactionBank01`(
`id` INT NOT NULL AUTO_INCREMENT COMMENT "賬號",
`name` VARCHAR(30) NOT NULL COMMENT "名稱",
`money` DECIMAL(9,2) NOT NULL DEFAULT 0 COMMENT "賬戶餘額00.00格式默認爲0",
PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
3.插入數據:
INSERT INTO `tansactionbank01`
(`name`,`money`)
VALUES
("張三",0),
("李四",1000);
最終效果:
2. 瞭解事務的基本操作
操作 | 作用 | 解釋 |
---|---|---|
set autocommit = 0; | 關閉自動提交,mysql默認啓動自動提交 | 使用手動事務之前關閉自動提交事務 |
set autocommit = 1; | 啓動功自動提交 | 使用手動提交事務之後開啓自動提交事務 |
start transaction; | 開啓一個(組)事務 | |
commit; | 提交事務 | 持久性,提交之後不能回滾了 |
rollback; | 回滾事務 | 回到最初的起點(有存檔的辦法可回到存檔點但是不常用瞭解即可.) |
3. 事務實例:使用事務李四給張三轉賬 500元
-- 1. 關閉自動提交,方便手動提交
SET autocommit = 0;
-- 2.開啓一個(組)新的事務
START TRANSACTION;
-- 3.進行事務轉賬操作
UPDATE `tansactionbank01` SET
`money` = `money`- 500
WHERE `name` = "李四";
UPDATE `tansactionbank01` SET
`money` = `money`+ 500
WHERE `name` = "張三";
-- 4. 回滾
ROLLBACK;
-- 4.2 提交
COMMIT;
-- 4.3 提交後再回滾 (數據已經更改持久性,不能回滾成功)
COMMIT;
ROLLBACK;
-- 5.把自動提交恢復爲默認.
SET autocommit = 1;