天天看點

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

一、SQL Server事務的本質

•  什麼是SQL Server資料庫事務?

事務:是作為單個工作單元而執行的--系列操作,如查詢和修改資料,甚至可能是修改資料定義。事務:保持邏輯資料一緻性與可恢複性,必不可少的利器。•  SQL Server資料庫事務舉例

在一個事務中,你寫了2條sql語句,一條是修改訂單表狀态,一條是修改庫存表庫存-1 。如果在修改訂單表狀态的時候出錯,事務能夠復原,資料将恢複到沒修改之前的資料狀态,下面的修改庫存也就不執行,這樣確定你關系邏輯的一緻,安全。

• 阿笨對SQL Server事務一句話總結

即這一組指令要麼都執行,要麼都不執行,通俗的了解就是共同進退。

二、SQL Server事務分類

SQL Server定義事務邊界的方式分為顯式事務和隐式事務兩種。

•  顯式事務:明确指出事務的起止邊界。如果不顯式定義事務的邊界,SQL Server 會預設把每個單獨的語句作為-一個事務;換句話說,SQLServer預設在執行完每個語句之後就自動送出事務。

顯示事務需要定義以BEGIN TRAN語句作為開始。如果想送出事務,則應該以COMMIT TRAN語句顯式結束事務;如果不想送出事務(撤消事務中的修改),則應該以ROLLBACK TRAN語句顯式結束事務。•  隐式事務:SQL查詢分析器中,目前會話預設就是為隐式事務。每執行一條DML操作,就直接送出到資料庫儲存。

三、SQL Server事務的小陷阱

下面的例子将兩個INSERT語句封裝在由BEGIN TRAN和COMMIT TRAN定義的一個顯示事務邊界中:

BEGIN TRAN;

INSERT INTO dbo. T1(keyco], col1, co12) VALUES(4, 101,'C);

INSERT INTO dbo. T1(keyco], col1, co12) VALUES(4, 101,'C);

COMMIT TRAN;

T-SQL使用下列語句來管理完整的事務(事務的基本三要素):

•  開始事務:BEGIN TRANSACTION

•  送出事務:COMMIT TRANSACTION

•  復原(撤銷)事務:ROLLBACK TRANSACTION

•  存儲點語句:SAVE TRANSACTION(可選)

所謂事務存儲點就是在事務過程當中插入若幹個标記,當事務執行中出現錯誤時,可以不撤銷整個事務,隻是撤銷部分事務,将事務退回到某個事物存儲點。一旦事務送出或復原,則事務結束。(備注:将事務復原在初始狀态成本有點大,那麼關于事務使用存儲點根據實際業務情況來判定是否使用。)

•   阿笨個人總結:

預設的隐式事務,在SQL Server查詢分析器中每一個單獨的語句就是一個事務,如果多行語句塊需要包裹在一個事務中的話,則需要手動的開啟顯示事務。

(2條消息)SQL Server中的事務(附有執行個體)_資料庫_legendaryhaha的部落格-CSDN部落格 https://blog.csdn.net/legendaryhaha/article/details/80550180?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

四、SQL Server事務的特性

事務必須有四個屬性:原子性(Atomicity)、一緻性 (Consistency)、隔離性(Isolation)、持久性(Durability) ,這4個屬性的首字母可以縮寫為ACID。
sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

A賬号向B賬号轉賬200

•  原子性(Atomicity)

原子性是指事務是一個不可分割的工作機關,事務中的操作要麼都發生,要麼都不發生。

針對同一個事務

操作前A:800,B:200

操作後A:600,B:400

一緻性表示事務完成後,符合邏輯運算。

•  一緻性(Consistency)

事務前後資料的完整性必須保持一緻。

針對一個事務操作前與操作後的狀态一緻

操作前A:800,B:200

操作後A:600,B:400

一緻性表示事務完成後,符合邏輯運算

•  隔離性(Isolation)

事務的隔離性是多個使用者并發通路資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個并發事務之間要互相隔離。

針對多個使用者同時操作(兩個事務同時進行),主要是排除其他事務對本次事務的影響。

即不同僚務之間的互相影響和隔離的程度。比如,不同的隔離級别,事務的并發程度也不同,最強的隔離狀态是所有的事務都是串行化的(serializable)(即一個事務完成之後才能進行下一個事務),這樣并發性也會降到最低,在保證了強一緻性的情況下,性能也會受很大影響,是以在實際工程當中,往往會折中一下。每個RMDB關系型資料庫的事務預設隔離級别是不一樣的。

•  持久性(Durability)

持久性是指一個事務一旦被送出,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

SQL SERVER通過write-ahead transaction log來保證持久性。write-ahead transaction log的意思是,事務中對資料庫的改變在寫入到資料庫之前,首先寫入到事務日志中。而事務日志是按照順序排号的(LSN)。當資料庫崩潰或者伺服器斷點時,重新開機動SQL SERVER,SQL SERVER首先會檢查日志順序号,将本應對資料庫做更改而未做的部分持久化到資料庫,進而保證了持久性.。

表示事務結束後的資料不随着外界原因導緻資料丢失

操作前A:800,B:200

操作後A:600,B:400

如果在操作前(事務還沒有送出)伺服器當機或者斷電,那麼重新開機資料庫以後,資料狀态應該為

A:800,B:200

如果在操作後(事務已經送出)伺服器當機或者斷電,那麼重新開機資料庫以後,資料狀态應該為

A:600,B:400

五、SQL Server事務的隔離級别

1)、什麼是資料庫隔離級别

資料庫的隔離級别實際上是針對事務的隔離級别來說的,它是用來限制一個事務中正在讀取或被修改的資料免于被其他事務修改的程度。理論上每個事務和其他的事務都應該完全隔離開來。然而出于性能和可行性的原因,實踐中幾乎不可能做到的。

2)、資料庫為什麼要有事務的隔離級别

在并發環境下如果沒有鎖和隔離級别, 不考慮事務的隔離性可能引發的問題 可能會發生以下四種情況:

髒讀:在這種情況下,一個事務能夠讀取另一個事務正在修改且未送出的資料,那麼另一個事務如果發生復原操作,将導緻第一個事務讀取到的資料和實際的資料不一緻;

丢失更新:這種情況下,事務沒有隔離。多個事務能夠讀取同一份資料并且修改它。最後對資料集做出修改的事務将勝出,而其他的事務所做的修改都失效;

不可重複讀:兩個事務讀取資料,但是在第二個事務讀取前,另一個事務修改了該資料,是以兩次讀取的資料不一緻;

幻讀:這種情況和不可重複讀類似,不同的是,兩個事務讀取一個範圍的資料,但是在第二個事務讀取之前,另一個事務新增了一條資料,導緻兩次讀取的結果不同。

要想解決髒讀、不可重複讀、幻讀等讀現象,那麼就需要提高事務的隔離級别。但與此同時,事務的隔離級别越高,并發能力也就越低。是以,還需要讀者根據業務需要進行權衡。 

在了解了并發情況下出現的上述問題後,就可以進一步了解隔離級别的概念,通俗一點講就是:你希望以何種方式将并發的事務隔離開來, 隔離到什麼程度?比如允許髒讀,等。隔離級别越高,讀取髒資料或者造成資料不一緻的情況就越少,但是在高并發系統中的性能降低就越嚴重。

2)、Sql Server支援6種隔離級别

•  未送出讀(Read Uncommited)

•  已送出讀(Read Commited)(Sql Server的預設事務隔離級)

•  可重複讀(Repeatable Read)

•  序列化(Serializable)

•  快照(Snapshot)

•  已送出讀快照(Read Commited Snapshot)

檢視SQL Server目前會話的隔離級别 

DBCC USEROPTIONS  

Sql Server的預設事務隔離級别是已送出讀(Read Commited),一個事務不允許讀取另一個事務未送出的資料。

Mysql預設的事務處理級别是可重複讀(Repeatable Read)也就是可重複讀。

Oracle預設系統事務隔離級别是已送出讀(Read Commited),也就是讀已送出。

備注:實際工作中一般資料庫預設的事務隔離級别做好不要去做修改。

六、SQL Server事務的實戰運用場景

1)、批量一次性送出事務處理資料(插入)。

一)、為什麼一次性送出事務批量插入資料效率最高?

使用事務可以提高資料的插入效率,這是因為進行一個INSERT操作時,SQL SERVER内部會建立一個事務,在事務内才進行真正插入處理操作。通過使用事務可以減少建立事務的消耗,所有插入都在執行後才進行送出操作。

二)、關于批量插入大資料的帶來的思考總結

•  為了提升效率,資料能一次送出不做多次送出;

•  能一次插入解析sql不要多次送出解析sql;

•  插入資料量太大時,需要程式預先切割資料;

2)、在事務範圍中如何防止查詢大面積的資料行内出現死鎖的情況

要提升SQL的查詢效能,一般來說大家會以建立索引(index)為第一考慮。其實除了index的建立之外,當我們在下SQL Command時,在文法中加一段WITH (NOLOCK)可以改善線上大量查詢的環境中資料集被LOCK的現象藉此改善查詢的效能。

鎖争用的解決方法:SQL Server開始是用行級鎖的,但是經常會擴大為頁面鎖和表鎖,最終造成死鎖。 幸運的是,我們可以通過SQL Server 的NOLOCK來手工處理。

NOLOCK的使用NOLOCK可以忽略鎖,直接從資料庫讀取資料。這意味着可以避開鎖,進而提高性能和擴充性。不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT有可能會造成Dirty Read,就是讀到無效的資料。

SQLServer性能優化之 nolock,大幅提升資料庫查詢性能 - 雲霏霏

 https://www.cnblogs.com/yunfeifei/p/3848644.html

七、SQL Server事務遵守原則

編寫事務時要遵守的原則大概總結如下:

•  事務盡可能簡短:

  事務啟動至結束後再資料庫管理系統中保留大量資源,以保證事務的原子性、一緻性,隔離性和持久性。如果在多使用者系統中,較大的事務将會占用系統的大量資源,是系統不堪重負,會影響軟體的性能,甚至導緻系統崩潰。

•  事務中通路的資料量盡量最少:

  當并發執行事務處理時,事務操作的資料量越少,事務之間對操作資料的争奪就越少。

•  查詢資料時盡量不要使用事務:

  對資料進行浏覽查詢操作并不會更新資料庫的資料,是以盡量不使用事務查詢資料,避免占用過量的系統資源。

•  在事務處理過程中盡量不要出現等待使用者輸入的操作:

   在處理事務的過程中,如果需要等待使用者輸入資料,那麼事務會長時間地占用資源,有可能造成系統阻塞。

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則
sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

騰訊課堂

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

網易雲課堂

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

不信的話,掃一掃

sqlserver leftjoin出現重複資料_SQL Server資料庫進階進階之事務實戰演練一、SQL Server事務的本質二、SQL Server事務分類三、SQL Server事務的小陷阱四、SQL Server事務的特性五、SQL Server事務的隔離級别六、SQL Server事務的實戰運用場景七、SQL Server事務遵守原則

繼續閱讀