事務,以及與鎖的區別

2021-10-03 21:35:31 字數 2195 閱讀 2989

1.基本概念

事務,一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元(unit)。

2、特性

事務應該具有4個屬性:原子性、一致性、隔離性、永續性。這四個屬性通常稱為acid特性。

原子性(atomicity)。乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

一致性(consistency)。事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。乙個事務的執行不能被其他事務干擾。即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

永續性(durability)。永續性也稱永久性(permanence),指乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響

下面重點說隔離性

3.隔離性

**中的事務和資料庫中的事務指的是同一件事,資料庫的事務預設是自動提交的,可以利用select @@autocommit;或者show variables like 'autocommit';來進行檢視

1,代表開啟,2代表關閉。利用相關語句將其關閉之後我們,就需要手動提交事務,例如:

然後我們可以設定事務的隔離級別,事務的隔離級別分為四級:未提交讀(read uncommitted)、已提交讀(read committed)、可重複讀(repeatable read)、序列化(serializable)。

未提交讀

a事務已執行,但未提交;b事務查詢到a事務的更新後資料;a事務回滾;—出現髒資料

已提交讀

a事務執行更新;b事務查詢;a事務又執行更新;b事務再次查詢時,前後兩次資料不一致;—不可重複讀

幻讀

序列化不允許讀寫併發操作,寫執行時,讀必須等待,允許執行讀讀操作;

如果還是不懂請參考:鏈結

4.有了事務為什麼還需要樂觀鎖和悲觀鎖

為了減輕資料庫壓力,放寬事務的鎖,把壓力放在應用伺服器上,也就使用了同步鎖;

為什麼有了事務這東西,還需要樂觀鎖悲觀鎖?事務是粗粒度的概念、樂觀鎖悲觀鎖可以更細粒度的控制;

比如搶票,假設餘票只有1張;隔離級別可以保證事務a和事務b不能讀到對方的資料,也不能更新對方正在更新的資料,但是事務a和事務b都認為還有1張余票,於是出票,並更新為0;

事務解決了併發問題,已經不存在併發問題了;

但是事務b讀取的是過時資料,依據過時資料做了業務處理;

所以需要樂觀鎖或者悲觀鎖,來記錄乙個資訊:當前已經讀取的資料,是不是已經過時了!

事務有這麼幾種實現方式:鎖協議、mvcc、時間戳排序協議、有效性檢查協議,鎖協議是事務的一種實現方式,事務 = 用鎖封裝的乙個函式,可以重用而已,但是這幾個事務的函式覆蓋面太粗粒度了,所以有時候我們還得借助於鎖來進行細粒度控制;

事務不能保證每個操作結果正確,售票時超賣還是會發生。

事務保證整個操作的成乙個組,要麼全做要麼全不做 但是不能保證多個事務同時讀取同乙個資料

資料物件被加上排它鎖時,其他的事務不能對它讀取和修改;加了共享鎖的資料物件可以被其他事務讀取,但不能修改

事務可以用鎖實現,可以保證一致性和隔離性,但是鎖用來保證併發性;

隔離性和併發性有點類似,但是隔離性只是保證不會出現相互讀取中間資料,卻無法解決併發的問題

即使最高隔離級別的序列化,也是允許多個事務同時讀取的,所以事務在高併發時依然能產生問題。

感謝博主的梳理

關於事務之間的呼叫,介紹,以及使用注意事項見url

事務隔離以及鎖

undo log binlog 併發事務的問題 事務隔離級別鎖死鎖 多版本併發控制,mvcc就是通過 讀取舊版本資料 來降低併發事務的鎖衝突,提高任務的併發度。mvcc底層通過了redo和undo日誌來保證innodb事務的acid特性。其中 redolog的寫入策略 binlog的寫入機制 快照讀...

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

Redis的事務與鎖

一.redis事務 redis的事務和傳統關聯式資料庫的事務並不相同。在關聯式資料庫中,使用者首先向資料庫伺服器傳送begin,然後執行各個相互一致的寫操作和讀操作,最後,使用者可以選擇傳送commit來確認之前所做的修改,或者傳送rollback來放棄那些修改。在redis裡面也有簡單的方法可以處...