1. 程式人生 > >資料庫事務以及鎖 知識點

資料庫事務以及鎖 知識點

      為了保證併發時資料的完整性以及正確性, 資料庫中引入了事務的概念 , 意為在某一個功能單元 , 要麼同時成功 , 要麼同時失敗 .

1.事務

    1.1  資料庫事務有四大特性:

       1.1.1原子性(Atomicity):事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。
       1.1.2 一致性(Consistemcy):事務執行前後,資料庫的狀態都滿足所有的完整性約束。
       1.1.3 隔離性(Isolation):併發執行的事務是隔離的,保證多個事務互不影響。如果有兩個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有一個請求用於同一資料。通過設定資料庫的隔離級別,可以達到不同的隔離效果。


       1.1.4 永續性(Durability):一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。

 1.2 資料庫事務有四大隔離級別:

有四級,預設是可重複讀REPEATABLE READ) ; oracel 預設級別是  讀已提交;

·        未提交讀(READUNCOMMITTED)。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料(髒讀)。

·        提交讀(READCOMMITTED)。本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不重複讀)。

·        

可重複讀(REPEATABLEREAD)。在同一個事務裡,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象(稍後解釋)。

·        序列化(SERIALIZABLE)。讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥。

四個級別逐漸增強,每個級別解決一個問題。

        可能產生的問題

.         髒讀,最容易理解。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料。

·        不重複讀。解決了髒讀後,會遇到,同一個事務執行過程中,另外一個事務提交了新資料,因此本事務先後兩次讀到的資料結果會不一致。

·        幻讀。解決了不重複讀,保證了同一個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另一個事務同時提交了新資料,本事務再更新時,就會驚奇的發現了這些新資料,貌似之前讀到的資料是鬼影一樣的幻覺。

隔離級別髒讀(Dirty Read)不可重複讀(NonRepeatable Read)幻讀(Phantom Read)
未提交讀(Read uncommitted)可能可能可能
已提交讀(Read committed)不可能可能可能
可重複讀(Repeatable read)不可能不可能可能
可序列化(Serializable )不可能不可能不可能

1.3 事務執行的三種模式
    1.3.1 自動提交事務:預設事務管理模式。如果一個語句成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。
    1.3.2 顯式事務:以BEGIN TRANSACTION顯式開始,以COMMIT或ROLLBACK顯式結束。

    1.3.3 隱性事務:當連線以此模式進行操作時,sql將在提交或回滾當前事務後自動啟動新事務。無須描述事務的開始,只需提交或回滾每個事務。它生成連續的事務鏈。

1.4 資料庫事務與事務日誌

        以mysql的innodb的事務為例,通過事務日誌實現ACID特性。事務日誌遵循WAL(Write-Ahead Logging 預寫日誌方式)協議。

        以oracel為例: 檢視資料庫日誌檔案路徑可用   SELECT * FROM V$logfile;  檢視近期操作日誌可用SELECT * FROM V$sql;    不過查出來的日誌直接看看得不是很直觀 ,  可用oracel提供的LogMiner來檢視分析後的日誌.

         資料庫日誌檔案是非常重要的檔案 , 如果不小心對資料庫進行誤刪等操作 ,  恢復時日誌檔案是很好的依據.

2. 鎖

    資料庫事務底層的實現就是通過鎖機制來實現的, 從大的分類上, 我們可以將鎖分為樂觀鎖和悲觀鎖, 而悲觀鎖又可延伸出共享鎖(讀鎖)  排他鎖(寫鎖)  再細分一點  可以分為行鎖 表鎖 頁鎖

樂觀鎖不是資料庫自帶的,需要我們自己去實現。樂觀鎖是指操作資料庫時(更新操作),想法很樂觀,認為這次的操作不會導致衝突,在操作資料時,並不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有衝突了。

通常實現是這樣的:在表中的資料進行操作時(更新),先給資料表加一個版本(version)欄位,每操作一次,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version欄位,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程式對其進行操作,則可以執行更新,將version欄位的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,則說明這段期間已經有其他程式對其進行操作了,則不進行更新操作。

共享鎖【S鎖】
又稱讀鎖,若事務T對資料物件A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。

排他鎖【X鎖】
又稱寫鎖。若事務T對資料物件A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

行鎖,由字面意思理解,就是給某一行加上鎖,也就是一條記錄加上鎖。

比如SELECT * from city where id = "1"  lock in share mode; 

由於對於city表中,id欄位為主鍵,就也相當於索引。執行加鎖時,會將id這個索引為1的記錄加上鎖,那麼這個鎖就是行鎖。

表鎖,和行鎖相對應,給這個表加上鎖。

mysql innodb事務死鎖:

   事務A需要先查詢資料1,然後修改資料2;

   事務B需要先查詢資料2,然後修改資料1;

此時2個事務併發執行,由於mysql innodb的預設隔離級別是可重複讀,讀鎖、寫鎖只能在事務結束才會釋放。

事務A中需要等待事務B釋放資料2的共享鎖,才能執行對資料2新增排他鎖;事務B需要等待事務A釋放資料1的共享鎖,才能執行對資料1新增排他鎖。這樣會就出現事務死鎖

這種死鎖在oracle中就不會出現,因為oracle的預設隔離級別是讀已提交,共享鎖在執行完查詢之後就會釋放,不會導致排他鎖無法新增的問題。

如果大家在看部落格時發現有說得不嚴謹的地方 , 歡迎回復交流. 

有四級,預設是可重複讀REPEATABLE READ)。

·        未提交讀(READUNCOMMITTED)。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料(髒讀)。

·        提交讀(READCOMMITTED)。本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不重複讀)。

·        可重複讀(REPEATABLEREAD)。在同一個事務裡,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象(稍後解釋)。

·        序列化(SERIALIZABLE)。讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥。

四個級別逐漸增強,每個級別解決一個問題。

相關推薦

資料庫事務以及 知識點

      為了保證併發時資料的完整性以及正確性, 資料庫中引入了事務的概念 , 意為在某一個功能單元 , 要麼同時成功 , 要麼同時失敗 .1.事務    1.1  資料庫事務有四大特性:       1.1.1原子性(Atomicity):事務是資料庫的邏輯工作單位,它對

關於資料庫事務的必會知識點,你掌握了多少?

> 關於MySQL資料庫的這些核心知識點,你都掌握了嗎? 推薦閱讀: - [這些必會的計算機網路知識點你都掌握了嗎](https://www.cnblogs.com/zydybaby/p/14154148.html) - [關於資料庫索引,必須掌握的知識點](https://www.cnblog

Oracle事務 知識點摘記

隔離級別 column 以及 lock 永久 啟動 實驗 不可 選中 事務:事務用於保證數據的一致性,它由一組相關的dml語句組成,該組的dml語句要麽全部成功要麽全部失敗。   說明:一組SQL,一個邏輯工作單位,執行整體修改或者整體回退。   事務的相關概念:    

分散式事務以及

標題格   1、非公平鎖   2、TCC分散式事務 1、非公平鎖  在加鎖過程,執行緒1執行,執行緒2處於等待佇列。 執行緒1執行結束,結果執行緒3搶先於執行緒2進行。這就是非公平鎖的簡單含義。  在ReentrantLock lock = new ReentrantLock()預設的就是非公平鎖,建構

資料庫-事務-樂觀-調優

關係型資料庫 基於關係代數理論 缺點:表結構不直觀,實現複雜,速度慢 優點:健壯性高,社群龐大 示例:     product表             product

資料庫事務詳解\何謂悲觀與樂觀

https://blog.csdn.net/aluomaidi/article/details/52460844 什麼是事務(Transaction)? 是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所

資料庫事務詳解

什麼是事務(Transaction)? 是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單

什麼是資料庫事務以及特性?

資料庫事務定義:資料庫是面向多使用者的共享機制,所以資料庫管理要具有併發性和同步機制,而事務就是一種多個執行步驟的執行特性,即要麼同時執行相應的操作要麼一個也不執行。這樣就保證了在多個使用者操作同一資料時資料的一致性。這樣保證資料一致性的操作執行特性就稱為事務。 事務的特性:原子性、一致

資料庫事務以及隔離級別

一、首先什麼是事務? 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要麼全部成功,要麼一個都不做。 事務的結束有兩種,當事務中所有步驟全部成功執行時,事務提交。如果

資料庫事務機制

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

資料庫事務以及JDBC事務隔離級別

儘管資料庫理論對併發一致性問題 提供了完善的解決機制,但讓程式設計師自己去控制如何加鎖以及加鎖、解鎖的時機顯然是很困難的事情。索性絕大多數資料庫以及開發工具都提供了事務隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題 。 常見的事務隔離級別包括:ReadUnCommitted、ReadCommitted

資料庫事務的關係

原文:http://blog.csdn.net/dreamwbt/article/details/53371687 概述:資料庫操作具有四個特性:原子性,隔離性,永續性,一致性。當多個執行緒操作同一個資料的時候根據不同執行緒或者事務的動作和時機的不同會出現不同的併發問題

資料庫事務(一)

簡述     關係型資料庫有四個顯著的特徵,即安全性、完整性、併發性和監測性。資料庫的安全性就是要保證資料庫中資料的安全,防止未授權使用者隨意修改資料庫中的資料,確保資料的安全。在大多數資料庫管理系統中,主要是通過許可來保證資料庫的安全性。完整性是資料庫的一個重要特徵,也是保

MySQL(一):MySQL資料庫事務

#基本概念 事務是指滿足ACID特性的的一組操作,可以通過Commit提交事務,也可以也可以通過Rollback進行回滾。會存在中間態和一致性狀態(也是真正在資料庫表中存在的狀態) #ACID + **Atomicity【原子性】**:事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗

資料庫事務以及事務的四個特性

如果你是一名後臺程式設計師開發,那麼你一定或多或少的接觸過事務。因為相對於高併發,且業務有一定複雜性的系統來說,事務是一定需要的,而且是必須的。他可以幫助我們將若干不同的子任務當成一個整體來完成,以保證整個業務的正確性。舉個簡單的例子:在七夕這天,你給你的女票發了一個520紅包對於錢款轉移的這個過程來說,存在

Oracle資料庫中資料操作和事務控制以及

表資料的操作(DML):     插入:     修改:     刪除:     合併:大資料操作的時候,資料倉庫      插入:使用values只能插入一行資料     插入空值:         1)不寫         2)插入空串         3)null

資料庫併發訪問、事務、髒讀、不可重複讀、幻讀

資料庫併發訪問、事務與鎖的關係 一、事務 I : 事務的定義: 首先,讓我們瞭解下什麼是事務?事務是作為單個邏輯單元工作執行的一系列操作。可以是一條 sql語句,也可以是多條 sql 語句 ( 這是它的描述性定義&nb

資料庫ACID以及事務隔離

事務:資料庫基本的處理單位 資料庫事務四個基本要素:ACID 原子性(Atomicity):事務中的操作要麼全部執行,要麼全部不執行—事務A給B轉錢,分為扣款和加款兩步驟,需全執行 一致性(Consistency):事務不破壞資料庫中資料的完整性—A給B轉錢,總額不變 隔離性(

資料庫事務的四大特性以及事務的隔離級別-與-Spring事務傳播機制&隔離級別 資料庫事務的四大特性以及事務的隔離級別

資料庫事務的四大特性以及事務的隔離級別     本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。   如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴ 原子性(Atomicity)

資料庫事務

一、什麼是事務 事務(Transaction),在計算機術語中是指訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。 一個數據庫事務通常包含對資料庫進行讀或寫的一個操作序列。它的存在包含有以下兩個目的: 1. 可恢復:為資料庫操作提供了一個從失敗中恢復到正常狀態的方