selenium爬取劉心悠的瓜🍉
阿新 • • 發佈:2020-08-13
事務
目錄
1. 什麼是事務
要麼都成功,要麼都失敗
- SQL執行:A給B轉賬 A 1000 --> 200 B 200
- SQL執行:B收到A的錢 A 800 --> B 400
將一組SQL放在一個批次中去執行
2. 事務原則:ACID原則
1. 原子性(Atomicity)
針對同一個事務
這個過程包含兩個步驟
A: 800 - 200 = 600
B: 200 + 200 = 400
原子性表示,這兩個步驟一起成功,或者一起失敗,不能只發生其中一個動作
2. 一致性(Consistency)
針對一個事務操作前與操作後的狀態一致
操作前A:800,B:200
操作後A:600,B:400
一致性表示事務完成後,符合邏輯運算
事務前後的資料完整性要保持一致
3. 隔離性(isolation)
針對多個使用者同時操作,主要是排除其他事務對本次事務的影響
兩個事務同時進行,其中一個事務讀取到另外一個事務還沒有提交的資料,B
4. 永續性(durability)
表示事務結束後的資料不隨著外界原因導致資料丟失
操作前A:800,B:200
操作後A:600,B:400
如果在操作前(事務還沒有提交)伺服器宕機或者斷電,那麼重啟資料庫以後,資料狀態應該為
A:800,B:200
如果在操作後(事務已經提交)伺服器宕機或者斷電,那麼重啟資料庫以後,資料狀態應該為
A:600,B:400
事務沒有提交:恢復到原狀
事務已經提交:持久化到資料庫
事務一旦提交就不可逆
5. 隔離所導致的一些問題
1. 髒讀
值一個事務讀取了另外一個事務未提交的資料
2. 不可重複讀
在一個事務內讀取表中的某一行資料,多次讀取結果不同。(這個不一定是錯誤,只是在某些場合不對)
3. 幻讀(虛讀)
是指在一個事務內讀取到了別的事務插入的資料,導致前後讀取不一致
3. 執行事務
graph TB id1(關閉自動提交)-->id2(開啟一個事務) id2-->id3(成功) id2-->id4(回滾) id3-->id5(開啟自動提交) id4-->id1-- ====================== 事務 ======================= set autocommit = 0 -- 關閉事務 set autocommit = 1 -- 開啟事務(預設的) -- 手動處理事務 set autocommit = 0 -- 關閉自動提交 -- 事務開啟 start transaction -- 標記一個事務的開始,從這個之後的SQL都在同一個事務內 insert into XXX insert into XXX -- 提交:持久化(成功!) commit -- 回滾:回到原來的樣子(失敗!) rollback -- 事務結束 set auto_commit = 1 -- 開啟自動提交 -- 瞭解 savepoint 儲存點的名稱 -- 設定一個事務的儲存點 rollback to savepoint 儲存點的名稱 -- 回滾到儲存點 release savepoint 儲存點的名稱 -- 撤銷儲存點
4. 模擬場景
模擬轉賬的
-- 轉賬
create database shop character set utf8 collate utf8_general_ci
use shop
create table `account` (
`id` int(3) not null auto_increment,
`name` varchar(30) not null,
`money` decimal(9,2) not null,
primary key (`id`)
)engine=innodb default charset=utf8
insert into `account` (`name`,`money`) values
('A',2000.00),
('B',10000.00)
-- 模擬轉賬:事務
set autocommit = 0; -- 關閉自動提交
start transaction; -- 開啟一個事務(後面的是一組事務)
update `account` set `money` = `money` - 500
where `name` = 'A' -- A減500
update `account` set `money` = `money` + 500
where `name` = 'B' -- B加500
commit; -- 提交事務,就被持久化了!
rollback; -- 回滾,持久化後無法回滾!
set autocommit = 1; -- 恢復預設值