mysql資料庫鎖的機制 及事務事件

2022-06-19 11:03:14 字數 3196 閱讀 8678

資料庫事務具有四個特徵,分別是原子性(atomicity)、一致性(consistency)、隔離性(isoation)、永續性(durability),簡稱為事務的acid特性。

事務的隔離性是指在併發環境中,併發的事務是相互隔離的。sql標準中定義了四種資料庫事務隔離級別,級別從低到高分別為:讀未提交(read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)、序列化(serializable)。在事務的併發操作中會出現髒讀、不可重複讀、幻讀。在事務的併發操作中第二類更新丟失可以通過樂觀鎖和悲觀鎖解決。

該隔離級別,所有事務都可以看到其他未提交事務的執行結果。通俗地講就是,在乙個事務中可以讀取到另乙個事務中新增或修改但未提交的資料。

該隔離級別可能導致的問題是髒讀。因為另乙個事務可能回滾,所以在第乙個事務中讀取到的資料很可能是無效的髒資料,造成髒讀現象。

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)

乙個事務只能看見已經提交事務所做的修改。換句話說,乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。

該隔離級別可能導致的問題是不可重複讀。因為兩次執行同樣的查詢,可能會得到不一樣的結果。

這是mysql的預設事務隔離級別

它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。通俗來講,可重複讀在乙個事務裡讀取資料,怎麼讀都不會變,除非提交了該事務,再次進行讀取。

該隔離級別存在的問題是幻讀

下面看下如何出現幻讀的

這是最高的隔離級別

它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。通俗地講就是,假如兩個事務都操作到同一資料行,那麼這個資料行就會被鎖定,只允許先讀取/操作到資料行的事務優先操作,只有當事務提交了,資料行才會解鎖,後乙個事務才能成功操作這個資料行,否則只能一直等待

該隔離級別可能導致大量的超時現象和鎖競爭。

從上面四種資料庫事務隔離級別介紹可以對應出解決的問題,如圖:

sql標準中對此沒有定義,不會出現該錯誤。

樂觀鎖在更新語句中增加過濾條件,進行版本的判斷,可以是這條記錄的版本號、更新時間等。然後通過影響行數來判斷是否更新成功。

> begin;

> select name,blance,utime from account where name='jack';

jack 1000 2018-06-12 18:20:06

> update account set blance=1200 where name='jack' and utime='2018-06-12 18:20:06';

> commit;

悲觀鎖悲觀鎖分為共享鎖和排它鎖。

共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,共享鎖是用來讀取資料的。另外,乙個事務獲取了同一資料的共享鎖,其他事務就不能獲取該資料的排它鎖。

排它鎖又稱為寫鎖,簡稱x鎖,顧名思義,排它鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排它鎖,其他事務就不能再獲取該行的其它鎖,包括共享鎖和排它鎖。另外不存什麼事務隔離級別,update/insert/delete會自動獲取排它鎖

共享鎖獲取方式:select * from account where name='jack' lock in share mode;

排它鎖獲取方式:select * from account where name='jack' for update;

mysql分為表級鎖和行級鎖,共享鎖和排它鎖是行級鎖。表級鎖在此不做討論。

最佳實踐

通常,對於絕大多數的應用程式來說,可以優先考慮將資料庫系統的隔離級別設定為讀已提交(read committed),這能夠在避免髒讀的同時保證較好的併發效能。儘管這種事務隔離級別會導致不可重複讀、幻讀和第二類丟失更新等併發問題,但較為科學的做法是在可能出現這類問題的個別場合中,由應用程式主動採用悲觀鎖或樂觀鎖來進行事務控制。

create table `account` (

`id` int(11) not null auto_increment,

`name` varchar(16) not null default '' comment '使用者名稱',

`blance` int(11) not null default '0' comment '餘額',

`ctime` timestamp not null default current_timestamp comment '寫入時間',

`utime` timestamp not null default current_timestamp on update current_timestamp comment '更新時間',

primary key (`id`),

unique key `uk_name` (`name`)

) engine=innodb default charset=utf8mb4 comment='使用者餘額表';

Mysql 事務及鎖機制

事務的基本概念 資料庫事務是構成單一邏輯工作單元的操作集合 注意點 1.資料庫事務可以包含乙個或多個資料庫操作,但這些操作構成乙個邏輯上的整體 2.構成邏輯整體的這些資料庫操作,要麼全部執行成功,要麼全部不執行 3.構成事務的所有操作,要麼全部對資料庫產生影響,要麼全部都不產生影響,即資料庫保持一致...

資料庫事務和鎖機制

前幾日有乙個獵頭公司的面試,其中問道我事務隔離這塊的知識點,猛一問真是想不起來啊,頓感羞愧啊,回來專門總結一下這方面的知識來夯實一下之前的知識體系,也提醒廣大園友們進步在於總結啊,好多不用的知識點,有時候有必要溫故知新啊。簡介 acid,是指在可靠資料庫管理系統 dbms 中,事務 transact...

MySQL資料庫的鎖機制

原文首發於 本文出自 rebornchang的部落格 拋開資料庫引擎說資料庫鎖機制的都是流氓 引言 mysql資料庫的引擎分為三種,myisam isam innodb以及memory,具體的引擎型別效能比較可以baidu到,這裡就不多說了,本文中所說的鎖機制基於innodb引擎,那為啥說基於inn...