1. 程式人生 > 實用技巧 >selenium爬取劉心悠的瓜🍉

selenium爬取劉心悠的瓜🍉

事務

目錄

1. 什麼是事務

要麼都成功,要麼都失敗


  1. SQL執行:A給B轉賬 A 1000 --> 200 B 200
  2. 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;	-- 恢復預設值