Transaction
交易管理
- 對資料庫執行一系列的交易,可能包含新增修改刪除指令,為了保證交易的正確性及完整性,必須符合ACID
- Atomicity(原子性):資料操作不能只有部分完成。一次的 transaction 只能有兩種結果:成功或失敗(發生錯誤必須Rollback)
- Consistency(一致性):transaction 完成前後,資料都必須永遠符合 schema 的規範,保持資料與資料庫的一致性
- Isolation (隔離性):資料庫允許多個 transactions 同時對其資料進行操作,但也同時確保這些 transaction 的交叉執行,不會導致數據的不一致(鎖定表格)
- Durability (耐久性):transaction 完成後,對資料的操作就是永久的,即便系統故障也不會丟失(仰賴資料庫備份及交易日誌)

Autocommit
- 交易可將多個異動視為一體,通常會搭配rollback(還原)及commit(確定交易)
- Workbench > Qeury > Auto-Commit Transactions預設為開啟,代表每次異動都被視為一個確定交易,所以無法還原
- Autocommit關閉後必須要搭配commit才可以確定交易
- 可以下指令顯示或修改auto-commit狀態
select@@autocommit; #顯示目前auto-commit狀態
set autocommit=0; #關閉autocommit
set autocommit=1; #開啟autocommit
select @autocommit;
set autocommit = 0;
insert into publisher(id,name,contact,phone) values('P001','Oreily','Peter','05-26525425'); #新增後會只有自己的連線看到資料別人看不到(存在資料庫系統的暫存檔)
rollback; #可以進行復原(取消這筆新增)
insert into publisher(id,name,contact,phone) values('P001','Oreily','Peter','05-26525425'); #再新增一次
commit; #確認後才會真的寫入資料表
####################################### 實作時,只需要寫上start transaction,就會自動會有完整性(失敗會自動rollback不會存檔)
START TRANSACTION;
UPDATE bankaccounts SET funds=funds-100 WHERE accountno='ACC1'; --statement2
UPDATE bankaccounts SET funds=funds+100 WHERE accountno='ACC2'; --statement3
COMMIT;
Savepoint
- 使用savepoint可以設定rollback欲回復的儲存點
--- SAVEPOINT
savepoint point01;
insert into publisher(id,name,contact,phone) values('P001','Oreily','Peter','05-26525425');
savepoint point02;
delete from publisher where id='P001';
--- 回復到指定savepoint
rollback to savepoint point02;
select * from publisher;