簡單介紹MySQL中的事務機制(3)_MySQL教程
推薦:mysql查詢區分大小寫高性能mysql查詢默認是不區分大小寫的 如: 效果是一樣的。 要讓mysql查詢區分大小寫,可以: 也可以在建表時,加以標識 測試30W數據 不支持索引,查詢效率底下,不建議考慮。上面這些sql語句乍看不會有什么問題,但是當表中的數據多了以后,問題就會凸顯出來,用不到索引,
InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。這些隔離級別之間的區別如下:
臟讀:一個事務讀取到了另外一個事務沒有提交的數據;
比如:事務T1更新了一行記錄的內容,但是并沒有提交所做的修改。事務T2讀取到了T1更新后的行,然后T1執行回滾操作,取消了剛才所做的修改。現在T2所讀取的行就無效了;
不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同;
比如:事務T1讀取一行記錄,緊接著事務T2修改了T1剛才讀取的那一行記錄。然后T1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為“不可重復”讀,因為T1原來讀取的那行記錄已經發生了變化;
幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同;
比如:事務T1讀取一條指定的WHERE子句所返回的結果集。然后事務T2新插入 一行記錄,這行記錄恰好可以滿足T1所使用的查詢條件中的WHERE子句的條件。然后T1又使用相同的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突然出現的一樣。
隔離級別越低,事務請求的鎖越少或保持鎖的時間就越短。InnoDB存儲引擎默認的支持隔離級別是REPEATABLE READ;在這種默認的事務隔離級別下已經能完全保證事務的隔離性要求,即達到SQL標準的SERIALIZABLE級別隔離。
我們可以可以用SET TRANSACTION語句改變單個會話或者所有新進連接的隔離級別。它的語法如下:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
注意:默認的行為(不帶session和global)是為下一個(未開始)事務設置隔離級別。如果使用GLOBAL關鍵字,語句在全局對從那點開始創建的所有新連接(除了不存在的連接)設置默認事務級別。你需要SUPER權限來做這個。使用SESSION 關鍵字為將來在當前連接上執行的事務設置默認事務級別。 任何客戶端都能自由改變會話隔離級別(甚至在事務的中間),或者為下一個事務設置隔離級別。
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
總結
這篇文章,基本上都是理論概念的堆積,實戰的東西基本沒有。但是,這些都不是問題,這也無法阻擋這篇文章成為一篇讀者喜歡的文章,是吧。好了,這篇關于MySQL中事務的文章就到此結束,以后如果有新的東西,就接著總結。
分享:WordPress如何修改Mysql數據庫的表前綴我們知道 WordPress 的數據庫表,可以設置前綴,默認是 wp_,很多同學也就默認用了 wp_,如果某種原因(比如提高安全性)要修改的 WordPress 數據的前綴,我們應該怎么做? 開始之前 修改數據是一件風險很高的工作,開始之前必然就是做好 數據庫備份 ,也可以 把博客設置
- 相關鏈接:
- 教程說明:
MySQL教程-簡單介紹MySQL中的事務機制(3)
。