MYSQL的伪行级锁_MySQL
bitsCN.com
MYSQL的伪行级锁 之前一直以为mysql的innodb引擎所支持的行级锁和oracle,postgresql是一样的,是对数据行上加锁。但其实是不一样的,理解不一样,对mysql的锁机制就容易产生误解。innodb的行级锁实际上是基于索引项来锁定的。以下是验证测试过程 一.数据准备mysql> use test;Database changedmysql> show create table t_kenyon /G*************************** 1. row *************************** Table: t_kenyonCreate Table: CREATE TABLE `t_kenyon` ( `id` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec) mysql> set autocommit = 0;Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%autocommit%';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | OFF |+---------------+-------+1 row in set (0.00 sec) mysql> select * from t_kenyon;+------+| id |+------+| 1 || 123 || 789 || 345 || 78 || 78 |+------+6 rows in set (0.00 sec)以上是测试表t_kenyon,设置提交方式为手动提交. 二.过程(开启两个session,分别设置autocommit=off) 1.session one updatemysql> update t_kenyon set id = 999 where id = 1;Query OK, 1 row affected (0.04 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t_kenyon;+------+| id |+------+| 999 || 123 || 789 || 345 || 78 || 78 |+------+6 rows in set (0.00 sec)2.session two updatemysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | OFF |+---------------+-------+1 row in set (0.00 sec) mysql> select * from t_kenyon;+------+| id |+------+| 1 || 123 || 789 || 345 || 78 || 78 |+------+6 rows in set (0.00 sec) mysql> update t_kenyon set id = 88888 where id = 345;第二个session更新的值是345,但是也一直被阻塞,直到session1被rollback或者commit,如果session1未做回滚或者提交,session2中的该阻塞在超出mysql的锁时间限制时自动回滚,该参数为innodb_lock_wait_timeout,默认值50秒 现象如下ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction加索引后的测试 3.session one update mysql> create index ind_kenyon on t_kenyon(id);Query OK, 0 rows affected (28.58 sec)Records: 0 Duplicates: 0 Warnings: 0 mysql> update t_kenyon set id = 999 where id = 1;Query OK, 1 row affected (0.03 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t_kenyon;+------+| id |+------+| 78 || 78 || 123 || 345 || 789 || 999 |+------+6 rows in set (0.00 sec)4.session two update mysql> select * from t_kenyon;+------+| id |+------+| 1 || 78 || 78 || 123 || 345 || 789 |+------+6 rows in set (0.00 sec) mysql> update t_kenyon set id = 7777 where id = 345;Query OK, 1 row affected (0.03 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t_kenyon;+------+| id |+------+| 1 || 78 || 78 || 123 || 789 || 7777 |+------+6 rows in set (0.00 sec)执行计划mysql> explain select * from t_kenyon where id = 345 /G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t_kenyon type: refpossible_keys: ind_kenyon key: ind_kenyon key_len: 5 ref: const rows: 1 Extra: Using where; Using index1 row in set (0.00 sec)可以看到加了索引后,不同的数据更新并没有被阻塞,实现了真正意义上行锁 三.行级锁的扩展限制 参考:http:///database/201208/145888.html 作者 kenyon bitsCN.com

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

pythonGIL(全域解釋器鎖)是Python中一個重要的機制,它限制了同一時刻只能有一個執行緒執行Python字節碼。這主要是為了確保Python解釋器的穩定性,因為Python的記憶體管理和垃圾回收機制都是單執行緒的。如果允許多個執行緒同時執行Python字節碼,就有可能導致記憶體損壞或其他不可預測的錯誤。 GIL的原理比較簡單。它是一個由Python解釋器維護的鎖,當一個執行緒執行Python字節碼時,它會取得GIL。其他執行緒如果想要執行Python字節碼,必須等待GIL被釋放。當GIL被釋放後,其他

標題:如何使用Oracle查詢表格是否被鎖定?在Oracle資料庫中,表鎖是指當一個事務正在對錶執行寫入操作時,其他事務想要對該表執行寫入操作或對表進行結構改變(如增加列、刪除行等)時會被阻塞。在實際開發過程中,我們經常需要查詢表格是否被鎖,以便更好地排除和處理相關問題。本文將介紹如何使用Oracle語句查詢表格是否被鎖,並給出具體的程式碼範例。要查詢表是否被鎖,我們

蘋果手機是最近大家選擇最廣泛的一款手機,但我們常常在網路上看到大家在討論蘋果手機有鎖與無鎖的差別,會糾結於要購買哪一種。今天陳斯琪就為大家普及一下iphone有鎖和無鎖的差別,為大家排憂解難。其實二者在外觀、功能上並沒有太大差別,關鍵就在價格以及使用上的一些問題。什麼是有鎖版與無鎖版沒有鎖版限制的蘋果手機指不受業者的限制,任何一家業者的SIM卡都可以正常使用。有鎖版是指加了網路鎖,只能使用指定的電信業者提供的SIM卡,不能使用其他的。其實沒有鎖版的蘋果手機就像我們的全網通手機一樣可以使用移動、

隨著網路應用的規模越來越大,分散式系統也越來越常見。在這些系統中,分散式鎖是一項不可或缺的功能。由於分散式鎖需求旺盛,因此存在著各種各樣的實現方式。其中,Redis是一種流行的,在分散式鎖定實作中被廣泛應用的工具。在本文中,我們將探討Redis實現分散式鎖的效能比較。一、Redis基礎概念在討論Redis的分散式鎖定效能之前,我們需要先了解一些Redis的基礎概

Go語言中的鎖實作同步並發程式碼,防止資料競爭:Mutex:互斥鎖,保證同一時間只有一個goroutine取得鎖,用於臨界區控制。 RWMutex:讀寫鎖,允許多個goroutine同時讀取數據,但僅一個goroutine同時寫入數據,適用於需要頻繁讀寫共享數據的場景。

並發程式設計中的鎖定與同步在並發程式設計中,多個行程或執行緒同時執行,這可能會導致資源爭用和不一致性問題。為了解決這些問題,需要使用鎖定和同步機制來協調對共享資源的存取。鎖的概念鎖是一種機制,它允許一次只有一個執行緒或程序存取共享資源。當一個執行緒或程序獲得鎖時,其他執行緒或程序將被阻止存取該資源,直到鎖被釋放。鎖的類型python中有幾種類型的鎖:互斥鎖(Mutex):確保一次只有一個執行緒或程序可以存取資源。條件變數:允許執行緒或行程等待某個條件,然後取得鎖定。讀寫鎖:允許多個執行緒同時讀取資源,但只允許一個執行緒寫入資

Golang鎖的底層實作原理詳解,需要具體程式碼範例概述:並發程式設計是現代軟體開發中非常重要的一部分,而鎖是實現並發控制的機制。在Golang中,鎖的概念被廣泛應用於並發程式設計。本篇文章將深入探討Golang鎖的底層實作原理,並提供具體的程式碼範例。互斥鎖(Mutex)的底層實作原理互斥鎖是Golang中最常用的鎖類型之一。它採用了一個底層資料結構sync.M

在Go語言中使用鎖實現線程安全隨著並發程式設計的不斷普及,確保資料在多個goroutine之間安全存取變得尤為重要。在Go語言中,可以使用鎖定來實現執行緒安全,確保共享資源在並發環境下的存取不會導致資料競爭問題。本文將詳細介紹如何在Go語言中使用鎖實現線程安全,同時提供具體的程式碼範例。什麼是鎖鎖是一種並發程式設計中常用的同步機制,可以在多個goroutine之間協調對共
