MySQL(四)事務和鎖

2021-09-05 01:21:51 字數 2226 閱讀 2877

事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的工作單位,它可以是一條sql語句(預設)、一組sql語句、或整個程式,要多條語句乙個事務,需要通過 『begin』(等價start transaction)、『commit』、『rollback 』來控制事務,並且它的開始可以由使用者顯示的控制,如果使用者沒有顯示地定義事務,則由資料庫管理員預設規定自動劃分事務。

事務具有4個特性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、和持續性(durability)。這四個特性簡稱為acid特性(acid properties)。

原子性:多個sql作為乙個整體執行,不可分割。

一致性:乙個事物內結果應當一致

隔離性:乙個事務的執行不能被其他事務干擾

持續性:事務一旦提交,事務內的修改將應當永久生效

begin;  // 表示事務的起點 等價方式: `start transaction`

sql1

sql2

...commit(提交,表示結果都將生效) 和 rollback(回滾,用來撤銷事務內的更改) 表示事務的終點

事務具有不同的隔離級別,隔離級別越低,併發性越好,但資料的一致性差,反之則併發性差,但資料一致性高。

由低到高:

讀未提交 < 讀提交 < 可重複讀(mysql預設) < 序列化讀

髒讀是由於事務一修改某一資料並將其寫回磁碟,事務二讀取同一資料後,事務一由於某種原因被撤銷,這時被事務一修改過的資料恢復原值,事務二讀到的資料就為「髒」資料,即不正確的資料,將隔離級別提公升到「讀提交」,可以避免髒讀。

如下圖:

如上圖,事務一將小紅的工資修改為700, 事務二讀到小紅的工資為700,而事務一由於某種原因撤銷了修改,小紅的工資恢復為1000,這時事務二讀到的資料為700,與資料庫內容不一致,這就是髒讀,將隔離級別提公升到「讀提交」,可以避免髒讀。

不可重複讀是指事務一讀取資料後,事務二執行更新操作,使事務一無法再現前一次讀取結果。

如下圖:

事務二查詢小紅工資時(1000),事務一修改了小紅工資(700),之後事務二在查詢小紅工資時,發現查到的工資和之前查到的不一樣,這就是不可重複讀。

一邊做查詢,一邊做插入。

如下圖:

這裡的編號為主鍵,事務一查詢編號的同時,事務二插入編號,這時事務一查詢出來的編號為10和20,沒查出編號30,事務一也想插入按順序插入編號,也就是插入30,但是由於事務二已經插入了編號30,因此事務一插入就報錯了(主鍵衝突,因為主鍵是唯一的),這就是幻讀。

因此要避免髒讀、不可重複讀、幻讀:將隔離級別提高到`序列化讀`,所謂的`序列化讀`就是把多版本併發退化到鎖的併發控制(也就是select語句上會被偷偷加上共享鎖)。

innodb 行級鎖, 只要兩個客戶端更新的是不同的行,互不干擾,預設新增的是意向鎖

select * from 表名 where ... for update

select * from 表名 where ... lock in share mode;  新增共享鎖-別人可以再加共享鎖,但不能再加排他鎖

myisam 表鎖,是鎖住整個表,mysql 8.0中已經去除myisam引擎的表,也表明mysql已不建議使用該引擎。

s(共享鎖)

x(排它鎖)

is(意向共享鎖)

ix(意向排它鎖)s相容

不相容相容

不相容x

不相容不相容

不相容不相容

is相容

不相容相容

相容ix

不相容不相容

相容相容

上述列表表示,如果乙個事務請求的鎖模式與當前的鎖相容,innodb就將請求的鎖授予該事務;反之,如果兩者不相容,該事務就要等待鎖釋放,並且意向鎖是innodb自動加的,不需使用者干預。

mysql 事務和鎖

事務是dbms得執行單位 開啟事務 set autocommit 0 取消自動提交 或begin 手動開啟乙個事務 提交乙個事務 commit 回滾乙個事務 rollback 在mysql的innodb 引擎中,預設每個操作 insert,update,select for update lock ...

MySQL 事務和鎖

和其他資料庫相比,mysql的鎖機制比較假單,不同的引擎支援不同的鎖機制。myisam和memory使用表級鎖,bdb使用頁面鎖和表級鎖 innodb預設支援行級鎖,也支援表級鎖。myisam表鎖有兩中,乙個是都鎖,乙個是寫鎖,相容性如下 模式讀鎖 寫鎖讀鎖 相容不相容 寫鎖不相容 不相容 可見my...

Mysql 事務和鎖

是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成為事務,必須滿足所謂...