Transaction

transaction
確保多個動作能一次完成

交錯執行時的Concurrency(並行),可能導致的問題有
Lost Update Problem(遺失更新問題)
Dirty Read Problem(不正確讀取問題)
The Incorrect Summary Problem(不正確的總和問題)

交易的ACID
Atomicity(單元性)
Consistency Preservation(一致性的保留)
Isolation(獨立性)
Durability or Permanency(永久性)

可回復性的交易排程,有以下兩種
循序排程
交錯排程

排程中會產生操作衝突的情況
table1 read(x) -> table2 write(x)
table1 write(x) -> table2 read(x)
table1 write(x) -> table2 write(x)

交易排程的可序列性,分為
Serial(序列性)
Non-Serial(非序列性)

……………………….

lock技術
lock level依最大至最小如下
database level
table level
page level
row level
column level ex:sqlserver

binary lock(二元鎖定)
有lock/unlock
避免在更改資料尚末完成時被其他更改資料的動作影響
做法:在更改資料前先lock,更改完後在unlock,此段時間內無法被外部更改一直到unlock後
可能問題:因被lock住,而外部無法讀資料

share/exclusive lock(共享/互斥鎖)
有read lock/write lock/unlock
可解決二元鎖定的問題
可能問題:序列化被打斷,會使記憶體未更新,導致抓取錯誤的值

two phase lock(2階段鎖定)
可解決序列化被打斷
可能問題:兩邊若佔著資源不放造成死結

死結預防
2邊都被lock時,有以下解法
wait-die 第一個先wait資源,之後lock的要主動釋放資源,第一個即可取得資源
wound-wait 第一個lock的強制將之後lock的釋放掉,第一個即可取得資源

ps:
死結預防:要求的資源中若有其中一個被lock,則釋放全部資源
死結偵測:先偵測所需的資源是否有被lock,若有則等會在做
死結避免:所有所需的資源都確定被自己lock才做

……………………………….

MS SQL Server 2005的transaction分為兩種
Implicit Transactions(隱含式交易)
Explicit Transactions(明確式交易)

隱含式交易
操作之前:預設即為交易的開始狀態
回復到操作之前:指令ROLLBACK
所有操作完畢,交易結束:指令COMMIT
ps
設定啟用隱含式交易
SET IMPLICIT_TRANSACTIONS ON
設定關閉隱含式交易
SET IMPLICIT_TRANSACTIONS OFF

明確式交易
操作之前:指令BEGIN TRANSACTION進入明確式交易
回復到操作之前:指令ROLLBACK
所有操作完畢,交易結束:指令COMMIT

…….

mysql使用transaction功能
table類型為InnoDB與BDB
操作之前:指令BEGIN
回復到操作之前:指令ROLLBACK
所有操作完畢,交易結束:指令COMMIT

table類型為myisam
操作之前:使用鎖定語法
LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
所有操作完畢,交易結束:解除鎖定語法
UNLOCK TABLES;