c 併發操作mysql MySQL併發控制

2021-10-17 20:48:29 字數 1553 閱讀 8756

1.讀寫鎖

1)讀鎖也叫共享鎖,寫鎖也叫排他鎖

2)讀鎖:相互不阻塞,多使用者可以同時讀取

3)寫鎖:會阻塞其他讀鎖和寫鎖,給定時間內只有乙個使用者寫入,其他使用者不能讀寫

2.鎖粒度

1)鎖粒度:一種提高共享資源併發性的方式,讓鎖定物件更有選擇性.

a盡量只鎖定需要修改的部分資料,而不是所有的資源

b最理想的方式是只對修改的資料片進行精確的鎖定

c加鎖也會消耗資源,用於獲得鎖,檢查鎖是否接觸,釋放鎖等操作.

d如果系統花費大量的時間來管理鎖,而不是訪問資料,那麼系統的效能可能會因此受到影響

2)鎖策略:在鎖的開銷和資料安全性直接尋求平衡,一般使用行級鎖row-level-lock

3)表鎖(table lock)

a最基本的,開銷最小的策略

b寫鎖優先順序比讀鎖高,寫鎖請求可能會被插入到讀鎖前面

c伺服器會為alter table等語句使用表鎖而忽略儲存引擎的鎖機制

4)行級鎖(row lock)

a最大程度支援併發處理,開銷代價也變大

b只在儲存引擎層實現,而伺服器層沒有實現(innodb,xtradb等引擎)

3.lock tables和unlock tables

1)oracle與sql server資料庫當中沒有這種語法

2)在mysql伺服器層實現的,與儲存引擎無關

3)命令格式lock tables tbl_name [as alias] [, tbl_name [as alias] ] ...

a修飾符low_priority用於之前版本的mysql,它會影響鎖定行為,但是從mysql 5.6.5以後,這個修飾符已經被棄用。如果使用它則會產生警告

b乙個執行緒獲得在乙個表上的read鎖

l該執行緒和所有其他執行緒只能從表中讀資料

l當前執行緒執行寫insert和更新update操作都會報錯:error 1099 (hy000): table 'test' was locked with a read lock and can't be updated

l其他執行緒執行寫insert和更新update操作都會被阻塞,直到釋放資源後執行

c乙個執行緒獲得在乙個表上的read local鎖

l該執行緒和所有其他執行緒只能從表中讀資料

l當前執行緒執行寫insert和更新update操作都會報錯:error 1099 (hy000): table 'test' was locked with a read lock and can't be updated

l其他執行緒可以進行寫insert操作,但是更新update操作被阻塞,直到釋放資源後執行

d對於事務型表,如innodb表,read local與read相同,因為mysql的預設事務級別為repeatable committed

e乙個執行緒在乙個表上得到乙個write鎖,那麼只有擁有這個鎖的執行緒可以從表中讀取和寫表。其它的執行緒被阻塞

4)unlock tables;會解鎖當前執行緒的所有鎖 特別注意:lock tables和事務互相影響可能會產生無法預料的結果,因此建議除了事務禁用了autocommit,其他時候不要顯式使用lock tables

Mysql mysql基本操作

建立擁有三個欄位的表單 create table qq id int primary key auto increment username varchar 100 password varchar 100 default charset utf8mb4 關於編碼問題,如果顯示問號,則可以在後面加個...

MySQL MySQL基礎操作(上)

本篇僅介紹最最基礎 也是最常用的操作。一 資料庫操作 show databases 檢視資料庫大全 create database 建立資料庫 use 切換資料庫 drop database 刪除資料庫 二 表操作 1 全域性操作 show tables 檢視 大全 create table 列名稱...

MySQL mysql 的讀寫鎖與併發控制

1.無論何時只要有多個查詢在同一時刻修改資料,都會產生併發控制的問題 2.討論mysql在兩個層面,伺服器層和儲存引擎層,如何併發控制讀寫 3.舉了個mbox郵箱檔案的例子,說如果有多個程序同時對mbox檔案寫東西,那麼在檔案的末尾會,交叉混亂的新增,比如程序1寫了幾行,程序2也寫了幾行,互相交叉,...