事務,以及與鎖的區別

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事務再次查詢時,前後兩次數據不一致;—不可重複讀

可重複讀

A事務無論執行多少次,只要不提交,B事務查詢值都不變;B事務僅查詢B事務開始時那一瞬間的數據快照;

串行化

不允許讀寫併發操作,寫執行時,讀必須等待,允許執行讀讀操作;
如果還是不懂請參考:鏈接
所以@transactional註解實際上就是在數據庫中的事務的開啓(begin)----->執行-------->提交(commit)的過程。
關於事務的隔離級別有一個規範化標準,用來規範MYSQL、orcal等數據庫,但是mysql已經解決的比該規範更好,如下
規範化標準:
在這裏插入圖片描述
但是MYSQl幫我們在可重複度的情況下幫我們把幻讀的情況解決了,所以,MYSQL在可重複讀的情況下是不會出現幻讀的。
本文的學習視頻:添加鏈接描述
4.有了事務爲什麼還需要樂觀鎖和悲觀鎖
爲了減輕數據庫壓力,放寬事務的鎖,把壓力放在應用服務器上,也就使用了同步鎖;

爲什麼有了事務這東西,還需要樂觀鎖悲觀鎖?事務是粗粒度的概念、樂觀鎖悲觀鎖可以更細粒度的控制;
比如搶票,假設餘票只有1張;隔離級別可以保證事務A和事務B不能讀到對方的數據,也不能更新對方正在更新的數據,但是事務A和事務B都認爲還有1張餘票,於是出票,並更新爲0;

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

但是事務B讀取的是過時數據,依據過時數據做了業務處理;

所以需要樂觀鎖或者悲觀鎖,來記錄一個信息:當前已經讀取的數據,是不是已經過時了!

事務有這麼幾種實現方式:鎖協議、MVCC、時間戳排序協議、有效性檢查協議,鎖協議是事務的一種實現方式,事務 = 用鎖封裝的一個函數,可以重用而已,但是這幾個事務的函數覆蓋面太粗粒度了,所以有時候我們還得藉助於鎖來進行細粒度控制;
事務不能保證每個操作結果正確,售票時超賣還是會發生。
事務保證整個操作的成一個組,要麼全做要麼全不做 但是不能保證多個事務同時讀取同一個數據
數據對象被加上排它鎖時,其他的事務不能對它讀取和修改;加了共享鎖的數據對象可以被其他事務讀取,但不能修改
事務可以用鎖實現,可以保證一致性和隔離性,但是鎖用來保證併發性;
隔離性和併發性有點類似,但是隔離性只是保證不會出現相互讀取中間數據,卻無法解決併發的問題

即使最高隔離級別的序列化,也是允許多個事務同時讀取的,所以事務在高併發時依然能產生問題。
感謝博主的梳理https://blog.csdn.net/u013444177/article/details/51760846

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章