為什麼要使用事務?
乙個經典的例子就是銀行轉賬問題。當把錢從乙個銀行轉到另乙個銀行的時候,這操作由兩步完成,首先要把錢從乙個銀行提取出來,然後再將錢存入另乙個銀行。如果此時,錢已經從乙個銀行提取出了,但將錢存入另乙個銀行的過程中或之前發生異常情況,如果沒有事務保護就會出現源賬號中錢減少,但目標賬號中的錢並沒有增加的情況。
事務簡介:從嚴格意義上講,事務是形成乙個邏輯工作單位的資料庫操作的匯集。通俗的講,事務是能以原子操作形式完成的一系列操作。
事務四個基本特性:
原子性:乙個事務中所有資料庫操作是乙個不可分割的整體,這些操作要麼全部執行,要麼全部無效。
一致性:在事務處理執行之前和之後,資料是一致的。
隔離性:乙個事務對另乙個事務沒有影響。
永續性:乙個事務一旦完成全部操作後,它對資料庫操作將永久反映在資料庫中。
為什麼要引入鎖?
多個使用者同時對資料庫操作會帶來資料不一致的問題。
併發的***:
丟失更新:兩個使用者或多個使用者同時修改資料庫,其中乙個使用者修改破壞了另乙個使用者的修改結果。
髒讀:乙個使用者程序讀取了另乙個使用者程序修改過但沒有正式提交的資料,這時導致了資料不一樣的情形發生了。
不可重複讀:乙個使用者讀取資料,另一使用者讀取該資料並修改,此時前乙個使用者在讀取發現前後兩次資料不一致。
幻影:乙個使用者讀取到一些資料,另乙個使用者插入一些資料,前一使用者再檢視的時候新資料就會出現。
事務的隔離級別
隔離級別 髒讀 不可重複讀 幻影
read uncommitted 可能 可能 可能
read committed 不可能 可能 可能
repeatable read 不可能 不可能 可能
serializable 不可能 不可能 不可能
鎖的分類
1.從程式設計師的角度看分為悲觀鎖和樂觀鎖。
悲觀鎖:依靠資料庫來管理鎖的工作。
樂觀鎖:不依賴資料庫的事務機制,是應用層面的。
2.從資料庫角度來看分為排它鎖、共享鎖和更新鎖。
排它鎖:排它 (x) 鎖可以防止併發事務對資源進行訪問。其它事務不能讀取或修改排它 (x) 鎖鎖定的資料。
共享鎖:共享(s)鎖允許併發事務讀取 (select
) 乙個資源。資源上存在共享 (s) 鎖時,任何其它事務都不能修改資料。一旦已經讀取資料,便立即釋放資源上的
共享(s 鎖,
除非將事務隔離級別設定為可重複讀或更高階別,或者在事務生存週期內用鎖定提示保留共享(s)鎖。
更新鎖:
用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
鎖的粒度
鎖的粒度是指被封鎖目標的大小,封鎖粒度小則併發性高;封鎖粒度大則併發性低。
sql server支援的鎖粒度可以分為為行、頁、鍵、鍵範圍、索引、表或資料庫獲取鎖。
Redis學習筆記 事務和鎖
本文是自己的學習筆記,學習資料如下 b站狂神說redis教程 2 redis實現樂觀鎖 redis事務不保證原子性,本質是一組命令的集合。就是將一組命令放進乙個佇列裡一條條執行,發生錯誤就觸發錯誤處理機制,之前已經執行成功的命令也不會回退。同時也說明,事務可以保證一組命令能順序執行。redis可以通...
事務和鎖 SQLite
2 事務 transaction 2.1 事務的週期 transaction lifecycles 程 序與事務之間有兩件事值得注意 1 哪些物件在事務下執行 這直接與api有關。2 事務的生命週期,即什麼時候開始,什麼時候結束以及它在什麼時候開始影響別的連線 這點對於併發性很重要 這涉及到sqli...
mysql 事務和鎖
事務是dbms得執行單位 開啟事務 set autocommit 0 取消自動提交 或begin 手動開啟乙個事務 提交乙個事務 commit 回滾乙個事務 rollback 在mysql的innodb 引擎中,預設每個操作 insert,update,select for update lock ...