亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server中事務和并發詳解

2020-07-14 13:32:04
字體:
來源:轉載
供稿:網友

A、Transaction(事務)是什么:

事物是SQL Server中的基本工作單元。通常它由幾個讀取和更新數據庫的SQL命令組成,但是這些操作都不被看為最終的,直到發出一個COMMIT命令為止。 事務是作為單一工作單元而執行的一系列操作。包括增刪查改。

2、事務的種類:

 事務分為顯示事務和隱式事務:

隱式事務:就是平常我們使用每一條sql 語句就是一個事務,只不過他們執行完成之后事務就跟著結束了。

顯示事務:就是需要我們來手寫了,這個時候就可以進行控制事務的開始和結束了。

 1 --顯式事務(對事物可以進行控制) 2  3 --開始事務 4 begin transaction; 5 update [Sales.Shippers] 6 set companyname='順豐' where shipperid=5; 7  8 select * from [Sales.Shippers]; 9 10 --結束事務:11 --第一種:事務的回滾12 rollback;13 14 --第二種:事務的提交15 commit;

3、事務很重要的四個屬性: 

 1、原子性:事務必須是原子工作單位。——在事務中修改數據,要么全都執行,要么全都不執行。在事務執行完成之前(調提交指令寫入到sql的事務日志之前),出現問題或重啟,sql server 會回滾所有的修改事務。 但是也有例外的錯誤不會回滾事務————例如:主鍵沖突和鎖超時等。  錯誤日志會 捕獲這些錯誤的指令,并記錄日志里面,然后執行一些操作(例如:回滾事務)

2、一致性:發生在同一進程的事物里面的 修改和 查詢是不會產生沖突的。保持訪問的數據的一致性。

3、隔離性:控制數據訪問的機制; 說明: 一個事務正在對一個表的數據正在修改, 還沒有執行完成;;這時另一個事務,想要查詢里面的數據,是不能查到的,必須等到 修改的事務執行完成。:sql server 采用的 “鎖”的機制,將正在修改的事務 處理的表的數據 鎖定。這樣是為了保證數據同步,數據的一致性。

4、持久性:  當一個事務的指令 已經提交到 事務日志里面,即使磁盤上的數據還沒有修改,這個時候數據庫的服務停止,在服務重啟的時候還會將事務日志里的指令執行(進行回復處理)。保證數據的持久性。

B、什么是并發性?
并發性可以定義為多個進程在相同時間訪問或者更改共享數據的能力。既然是能力,那么一個系統的并發性就會有強弱之分。既然如此,我們該怎樣判斷一個系統并發行的強弱呢?
一般情況而言,一個系統在互不干擾的情況下可以激活的并發用戶的進程數越多,該系統的并發性就越強。
可能影響并發性的一些原因分析:
當正在更改數據的進程阻止其他進程讀取該數據時,或者當讀取數據的進程阻止其他進程更改該數據時,并發行會減弱。另外,當多個進程試圖同時更改相同數據時,且無法在不犧牲數據的一致性的前提下都能成功時,并發性也會受到影響。對于并發性的理解我們和容易聯想到鐵道部的訂票網站。由于處理并發性能力不夠,導致訂票高峰出現奔潰現象,對網絡訂票造成不良影響。由此可見,一個大型網站的數據庫系統提高處理并發性的能力是在必要。

處理并發性的方法:

SQLServer 2008提供兩種方法:樂觀和悲觀兩個模型。我們可以通過一下命令來指定:
SETTRANSACTION ISOLATION LEVEL(事物的隔離級別)來指定。

兩者的區別:
在兩種模型中,兩個進程試圖在相同時間修改相同數據時,可能會出現沖突。那么這兩個模型之間的區別在于沖突是在出現前被避免還是在出現后采取某種方式進行處理。
悲觀并發模型:
對于悲觀并發SQL Server默認的行為是獲取鎖來阻塞對另一個進程正在使用的數據的訪問。悲觀并發假設系統中有足夠的數據修改操作,因而給定的任何一個讀寫操作都可能受到另外一個用戶的數據修改操作的影響。悲觀并發通過獲得正在被讀取數據上的鎖,使其他進程無法修改該數據而避免沖突。換言之,在悲觀模型下,讀取者阻塞寫入者,寫入者也阻塞讀取者。

樂觀并發模型:
樂觀并發假設系統中有足夠少的數據修改操作,因而任何單個事物都不太可能另一個事物正在修改的數據。樂觀并發的默認行為是使用行版本控制來允許數據讀取者看到修改之前的數據狀態。數據行教老的版本被保存,所以讀取數據的進程可以看到進程開始讀取時的數據,不會受到對該數據正在做出任何更改的進程的影響。換言之,讀取者不阻塞寫入者,寫入者也不阻塞讀取者,但是,寫入者可以而且會阻塞寫入者,這也是導致沖突的原因所在。這時SQL Server在沖突出現時產生一個錯誤信息,但是是由應用程序來負責影響該錯誤。

上面將基本的事務介紹了一下,下面開始介紹并發。所以必須要介紹就是事務的“鎖”。

4、事務中的鎖

 事務中都含有什么鎖呢?

最常用的鎖:排它鎖(獨占鎖)和共享鎖,還有其他的鎖,這里就不做介紹了,比如:更新鎖、架構鎖、意向鎖等。

5、排它鎖和共享鎖

 排它鎖:

當一個事務執行更新修改操作的時候會申請排它鎖,主要是在寫操作里面使用。需要注意的兩點:1、一個事務含有排它鎖,就不能含有其他任何鎖。2、一條數據只能被一個排它鎖鎖住,就不能再被其他排他鎖鎖定。

共享鎖:

 主要是在讀操作中使用,并且多個事務可以同時對一條數據使用共享鎖。

排它鎖和共享鎖最重要的區別:排它鎖是不能被控制他的處理方式和時間,但是共享鎖是可以控制其隔離級別來控制其處理的時間。

1 begin transaction;2 update [Sales.Shippers] set companyname='順豐' where shipperid=5;3 --事務還沒有查詢完成,為這條數據 加上一個 排它鎖。這時這條數據就不能被其他進程 訪問到

事務還沒有執行完成,再開一個線程,執行查詢操作

1 select * from [Sales.Shippers] where shipperid=5

因為讀操作默認使用的共享鎖,但是這個時候這條數據已經被其他線程的排它鎖鎖住,所以會造成阻塞,直到排它鎖釋放。

6、隔離級別 

 首先要先明白三點:

1、用于控制并發用戶如何讀寫數據的操做。

2、讀操作默認使用共享鎖;寫操作需要使用排它鎖。

3、讀操作能夠控制他的處理的方式,寫操作不能控制它的處理方式

隔離級別分為六種:

read uncommited(讀取未提交數據),read commited(讀取已提交數據)讀取的默認方式,repeatable read(可重復讀),serializable(可序列化),snapshot(快照),read commited snapshot(已經提交讀隔離)(后兩個是sql server 2005 里面 引入的)。隔離的強度依次遞增。

 1、read uncommitted:

1 select * from [Sales.Shippers] where shipperid=3;

 查詢結果:

在本線程內執行:

1 begin transaction;2 update [Sales.Shippers] set companyname='圓通' where shipperid=3;

在另外一個線程內 使用 read uncommitted 隔離級別 查詢數據:

1 --設置讀操作的隔離級別2 set transaction isolation level read uncommitted;3 select * from [Sales.Shippers] where shipperid=3;

 查詢結果:

如果這個時候將那個事務回滾,那么這個時候  查詢到的數據就是“臟數據”。

總結:

read uncommitted:最低的隔離級別:查詢的時候不會請求共享鎖,所以不會和排它鎖產生沖突(不會等待排它鎖執行完),查詢效率非常高,速度飛快。但是缺點:會查到“臟數據”(排它鎖的事務已經將數據修改,還沒提交,這個時候查詢到的數據 是已經更改過的。如果事務回滾,就是“臟數據”)

優點:查詢效率非常高,速度非??臁?/p>

缺點:會產生“臟數據”

適用性:

適用于 像聊天軟件的 聊天記錄,會是軟件的運行速度非???。 但是不適用于 商務軟件。尤其是銀行

2、read committed

 讀取的默認隔離級別就是read committed 和上面正好相反。如果上面情況,采用read committed 隔離級別查詢的話查到的就是還沒有更改之前的數據。

 所以在這里就不再演示。

3、repeatable read:

 查詢的時候會加上共享鎖,但是查詢完成之后,共享鎖就會被撤銷。比如一些購票系統,如果查到票了,當買的時候就沒有,這是不行的。所以要在查詢到數據之后做一些延遲共享鎖,進而阻塞排它鎖來修改。

在查詢線程里面執行sql語句:

1 set transaction isolation level repeatable read;2 begin transaction;3 select * from [Sales.Shippers] where shipperid=4;

然后在 另外一個線程內執行修改語句:

update [Sales.Shippers] set companyname='shit' where shipperid=4;

這個時候會將更改的線程阻塞掉:

4、serializable(可序列化)

 更高級的 隔離。用戶解決“幻讀”。就是使用上面的  加上共享鎖 并不撤銷,如果鎖定的 一行數據,那么 其他的進程 還可以對 其他的數據進行操作,也可以 進行新增和刪除的操作。   所以如果想要在查詢的時候,不能對整張表進行任何操作,那么就要 將表的結構也 鎖定    (就需要使用 更強的 鎖定)

在查詢線程執行sql語句:

1 set transaction isolation level serializable;2 3 begin transaction;4 select * from [Sales.Shippers] where shipperid=3;

那么在另外一個線程執行下面兩個語句,不論那一條語句都會阻塞?。?/p>

update [Sales.Shippers] set companyname='聯邦' where shipperid=3;insert into [Sales.Shippers] (companyname,phone) values('韻達','12345678')

總結:

可序列話 隔離讀操作:用戶 解決 幻影數據(將標的數據和表的結構都鎖定),是并發降低...隔離級別越高,并發越低,但是效率越低,所以不是要確定使用  最好不要使用

下面兩種隔離級別是在 sql server 2005才出現的,隔離級別更高:

5、snapshot(快照)

 為數據產生一個臨時數據庫,當sql server 數據更新之前將當前數據庫復制到 tempdb數據庫里面,查詢就是從tempdb數據庫中查詢

--設置數據庫支持快照隔離級別:alter database ssdemo set allow_snapshot_isolation on;--這個時候會產生一個臨時數據庫(寫操作的排它鎖鎖定的是 現實存在的數據庫,,讀操作的讀取的是 臨時數據庫)

 在一個線程中執行 更新操作,用排它鎖鎖定當前數據

begin transaction;--使用 排它鎖(獨占鎖)X,鎖定 下面的那條數據update [Sales.Shippers] set companyname='飛鳳' where shipperid=3;

這個時候在在另外一個線程中查詢這條數據(默認的隔離級別),就會將當前線程阻塞。

如果使用 snapshot 隔離級別查詢就不會阻塞。

1 set transaction isolation level snapshot;2 --下面的就可以  從臨時數據庫中查詢到數據3 begin transaction;4 --使用 共享鎖 S5 select * from [Sales.Shippers] where shipperid=3;--查詢到的 是還沒有完成更新之前的數據

但是同時也會帶來兩個問題:

1、當 另外一個事務  已經提交,但是這邊的查詢到數據還是沒有修改。因為 每次查詢到的快照是針對于 本次回話對應的那個 transaction 的,因為在這個事務里面是沒有修改的,所以查詢到的數據是沒有修改的。

2、(更新問題)因為 那邊的數據已經是 飛鳳公司了,但是這里還是   聯邦,所以,在這個事務里面是不能對表進行修改,因為訪問的是臨時數據庫,想要對 數據庫修改是不可能的(sql server 就會報錯,阻止修改) 

針對于上面兩個問題,所以下面 更高的隔離級別出現了 read committed snapshot:

6、read committed snapshot

 首先開啟數據庫的 read committed snapshot 隔離級別:

1 --設置 數據庫 為 讀取已經提交的快照 開啟2 alter database ssdemo set read_committed_snapshot on;

在一個線程中執行:

begin transaction;update [Sales.Shippers] set companyname='聯邦' where shipperid=3;

在另外一個線程中:

1 --不用顯示聲明使用  read committed snapshot 隔離級別,因為設置完 read_committed_snapshot 隔離級別啟動,默認就是 read commited snapshot 隔離級別2 begin transaction;3 select * from [Sales.Shippers] where shipperid=3;--查詢到是 已經提交之后的數據4 5 update [Sales.Shippers] set companyname='xiaoxiao' where shipperid=3;

這個時候查詢到的數據是還沒有更改之前的,如果將 前面的那個回話提交,那么在查詢 查詢到的數據是 提交修改之后的數據。所以解決了上面的問題1.

如果在修改的話。也是在第一個 更新線程中的事務更新之后的數據進行執行修改的操作,不會報錯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影成人av99爱色| 亚洲护士老师的毛茸茸最新章节| 青青精品视频播放| 国产精品电影观看| www.国产精品一二区| 欧美亚洲国产日韩2020| 中文字幕日韩欧美在线视频| 日韩欧美中文字幕在线播放| 狠狠躁夜夜躁久久躁别揉| 国产欧美精品一区二区三区介绍| 国产精品高清网站| 国产精品久久久久99| 亚洲老板91色精品久久| 69av成年福利视频| 91丝袜美腿美女视频网站| 欧美激情一区二区三区高清视频| 成人黄色免费网站在线观看| 亚洲国产精品久久久久秋霞不卡| 欧美国产日韩一区二区三区| 欧美国产亚洲精品久久久8v| 国产成人精品久久二区二区| 国产精品美女主播在线观看纯欲| 国产亚洲综合久久| 精品中文视频在线| 成人欧美在线观看| 亚洲香蕉伊综合在人在线视看| 久久久久久免费精品| 日本亚洲欧美三级| 久久天堂电影网| 97碰碰碰免费色视频| 中文欧美日本在线资源| 久久久久久av| 亚洲日本欧美日韩高观看| 久久精品视频免费播放| 日韩美女中文字幕| 成人激情电影一区二区| 97在线视频免费看| 日韩欧美在线一区| 欧美网站在线观看| 国产91精品不卡视频| 日韩欧美国产激情| 国产一区二区三区视频| 国产精品久久久久久亚洲影视| 国产精品99蜜臀久久不卡二区| 国产精品中文久久久久久久| 91免费国产网站| 欧美在线观看网址综合| 国产不卡av在线免费观看| 欧洲亚洲在线视频| 色婷婷综合成人av| 日韩高清av一区二区三区| 欧美日韩中文字幕日韩欧美| 中文日韩电影网站| 欧美性极品xxxx做受| 国内精品久久久久久影视8| 久99九色视频在线观看| 欧美电影免费观看高清| 国产精品va在线播放我和闺蜜| 日韩在线视频线视频免费网站| 国产欧美久久一区二区| 国语自产精品视频在线看抢先版图片| 国产精品久久久久国产a级| 国产不卡在线观看| 91综合免费在线| 亚洲国产日韩一区| 91av网站在线播放| 国产精品永久免费观看| 91黑丝在线观看| 成人黄色影片在线| 精品中文字幕乱| 中文字幕日韩在线观看| 91久久久久久国产精品| 91精品国产自产在线老师啪| 色综合天天综合网国产成人网| 日韩欧美在线免费| 欧美日韩在线视频观看| 欧美丰满老妇厨房牲生活| 日韩亚洲在线观看| 色偷偷偷亚洲综合网另类| 国产成人小视频在线观看| 国产精品视频男人的天堂| 欧美裸体xxxx| 国产精品久久久久高潮| 国产精品白嫩美女在线观看| 国产91精品黑色丝袜高跟鞋| 久久成人这里只有精品| 国产精品一二三视频| 69久久夜色精品国产7777| 亚洲bt天天射| 国产精品羞羞答答| 亚洲精品国产福利| 久久6免费高清热精品| 亚洲午夜精品久久久久久久久久久久| 亚洲综合在线中文字幕| 亚洲免费伊人电影在线观看av| 国产成+人+综合+亚洲欧美丁香花| 亚洲自拍偷拍视频| 久久久国产影院| 综合久久五月天| 国产精品扒开腿做| 日韩电影免费观看在线| 欧美极品美女电影一区| 亚洲国产精品字幕| 97精品在线观看| 久久久999国产精品| 国产精品一区二区电影| 国产乱人伦真实精品视频| 国产欧美日韩丝袜精品一区| 18性欧美xxxⅹ性满足| 欧美精品成人在线| 亚洲国产成人精品久久| 欧美尺度大的性做爰视频| 国产亚洲激情在线| 精品成人乱色一区二区| 亚洲午夜未满十八勿入免费观看全集| 精品久久久久久亚洲精品| 国产精品天天狠天天看| 日韩一区二区三区在线播放| 久久精品一偷一偷国产| 色香阁99久久精品久久久| 国产精品高潮呻吟久久av野狼| 丰满岳妇乱一区二区三区| 亚洲日本欧美日韩高观看| 91久久嫩草影院一区二区| 最近2019好看的中文字幕免费| 麻豆一区二区在线观看| 欧美肥老太性生活视频| 97精品久久久中文字幕免费| 亚洲国产日韩欧美在线图片| 777国产偷窥盗摄精品视频| 国产精品美乳在线观看| 亚洲欧美自拍一区| 在线观看欧美日韩| 国产综合香蕉五月婷在线| 在线观看欧美日韩| 91沈先生作品| 成人激情电影一区二区| 色七七影院综合| 91精品国产综合久久香蕉| 久久香蕉国产线看观看av| 精品综合久久久久久97| www.久久撸.com| 国产精品99导航| 国语自产精品视频在线看抢先版图片| 日韩欧美黄色动漫| 91影视免费在线观看| 国产欧美一区二区三区久久| 欧美日韩一区二区免费在线观看| 亚洲欧美日韩中文视频| 亚洲视频在线观看| 国产精品国模在线| 国外日韩电影在线观看| 国产精品∨欧美精品v日韩精品| 精品国产一区av| 欧美激情网站在线观看| 精品人伦一区二区三区蜜桃网站| 91精品在线播放| 欧美性xxxx18| 欧美日韩国产精品一区二区不卡中文| 亚洲色图欧美制服丝袜另类第一页| 亚洲精品免费一区二区三区| 亚洲欧洲xxxx| 久久九九免费视频| 亚洲国产精品小视频|