mysql 事務

orchidllh發表於2005-06-22

Mysql使用了一個平面事務模型:巢狀的事務是不允許的,在第一個裡面使用start transaction或者begin之後,第二個事務開始的時候,
自動的提交第一個事務。同樣,許多其他的Mysql命令執行的時候都會隱藏的執行一個commit命令,下面是一個列表:
DROP DATABASE/DROP TABLE
CREATE INDEX/DROP INDEX
ALTER TABLE/RENAME TABLE
LOCK TABLES/UNLOCK TABLES
SET AUTOCOMMIT=1


Mysql4.0.14和4.1.1,支援儲存點,可以在事務中關鍵的地方做標記,需要的話可以部分撤銷。

Mysql提供了兩個變數控制事務行為---AUTOCOMMIT 和 TRANSACTION ISOLATION LEVEL
預設情況下是自動提交的,SET AUTOCOMMIT=0可以關掉自動提交,如果退出沒有提交,則自動回滾。

通過SELECT @@AUTOCOMMIT;
取得當前的自動提交模式。
mysql> select @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)

事務孤立性
Mysql提供了四種孤立級別:
序列化(SERIALIZABLE)
可重複讀(REPEATABLE READ)
提交的讀(READ COMMITTED)
未提交的讀(READ UNCOMMITTED)

序列化:
提供最大程度的隔離,如果每個事務都以這種孤立級執行就會影響Mysql的效能,因為需要大量的資源來使大量事務在任一時刻不被看到。

可重複讀:
看起來和序列化的孤立級別很相似。
有一個很重要的不同點:雖然一個事務不能看到其他正在執行的當前事務做出的變化,但是它可以看到新的紀錄(其他事務新增到資料庫的)。

提交的讀:
安全性比可重複讀要差。
不僅處於這一級的事務可以看到其他事務新增的新紀錄,而且其他事務對現存紀錄做出的修改一旦被提交,也可以看到。
也就是說,這意味著在事務處理期間,如果其他事務修改了相應的表,那麼同一個事務的多個select語句可能返回不同的結果。

未提交的讀:
提供了事務之間最小程度的隔離。除了容易產生虛幻的讀操作和不能重複的讀操作外,處於這個孤立級的事務可以讀到其他事務還沒有提交的
資料。如果這個事務使用其他事務未提交的變化作為計算的基礎,然後那些未提交的變化被他們的父事務撤銷,則導致了大量的資料變化。

可以通過
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
修改孤立級別。

預設是可重複讀的

取得當前的孤立級別:
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

預設情況下,這個變數的值是基於每個會話設定的,但是可以通過新增global關鍵字對所有的會話進行全域性設定。
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

需要super優先權執行這個操作。

具有非事物表的偽事務
InnoDB和BDB表支援事物的概念,MyISAM表型別不支援這些鎖定機制。所以要明確設定表鎖定,以避免同時存在的事物互相侵犯空間。

Mysql提供了以下實現表鎖定的句法:
LOCK TABLES table-name lock-type,....

解鎖命令:
UNLOCK TABLES;

不用指定解鎖的表名。

有兩種型別的表鎖定:讀鎖定和寫鎖定。

讀鎖定:
表的讀鎖定是指設定鎖定的執行緒可以從表中讀資料,其他執行緒也可以。不過每個執行緒都不能修改鎖定的表,只要鎖定處於活動狀態就不能新增、
更新或者刪除紀錄。

READ鎖定的一個變體是READ LOCAL鎖定,它和常規的READ鎖定是不同的,因為其他執行緒可以執行INSERT語句,它和初始化鎖定的執行緒擁有的
會話不衝突。它是為了使用mysqldump工具對一個表同時進行多個INSERT操作而建立的。

寫鎖定:
表的寫鎖定是指設定鎖定的執行緒可以修改表中的資料,但是其他執行緒在鎖定期間既不能從表中讀資料也不能寫資料。

鎖定的優先權:
在同時涉及到WRITE和READ鎖定的情況下,MYSQL對於寫鎖定分配較高的優先順序來保證對於表的修改可以儘快地儲存到磁碟上。這就降低了
磁碟崩潰或者系統失敗導致更新丟失的危險。

表鎖定重要的缺點之一:
如果一個執行緒不釋放它的鎖定,其他試圖訪問這個已鎖定表的嘗試都會超時等待,導致了整體效能很大程度的降低。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/51862/viewspace-180648/,如需轉載,請註明出處,否則將追究法律責任。