首頁 資料庫 mysql教程 MYSQL的伪行级锁_MySQL

MYSQL的伪行级锁_MySQL

Jun 01, 2016 pm 01:41 PM

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
Python GIL(全域解釋器鎖定):揭秘背後的原理與效能影響 Python GIL(全域解釋器鎖定):揭秘背後的原理與效能影響 Feb 27, 2024 am 09:00 AM

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

如何使用Oracle 查詢表是否被鎖? 如何使用Oracle 查詢表是否被鎖? Mar 06, 2024 am 11:54 AM

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

蘋果有鎖和無鎖的差別是什麼 詳細介紹:iphone有鎖和無鎖的差別對比 蘋果有鎖和無鎖的差別是什麼 詳細介紹:iphone有鎖和無鎖的差別對比 Mar 28, 2024 pm 03:10 PM

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

Redis實現分散式鎖定的效能對比 Redis實現分散式鎖定的效能對比 Jun 20, 2023 pm 05:46 PM

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

golang函式中的鎖是如何實現的? golang函式中的鎖是如何實現的? Jun 05, 2024 pm 12:39 PM

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

Python 並發程式設計中的鎖與同步:保持你的程式碼安全可靠 Python 並發程式設計中的鎖與同步:保持你的程式碼安全可靠 Feb 19, 2024 pm 02:30 PM

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

深入解析Golang鎖的底層實作機制 深入解析Golang鎖的底層實作機制 Dec 28, 2023 am 11:26 AM

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

如何在Go語言中使用鎖實現線程安全 如何在Go語言中使用鎖實現線程安全 Mar 23, 2024 pm 07:00 PM

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

See all articles