MSSQL隔離級別理解

2021-06-17 17:33:17 字數 2191 閱讀 5396

資料庫的六種隔離級別的自我理解:

隔離級別(isolation level)分類:未提交事務(read uncommitted

已提交事務(read committed

可重複度(repeatableread

可序列化(serializable)最高端別

其實這幾種隔離級別最終是對資料庫增刪改查進行的鎖的限制。

比如說在中寫入

create table product(productid int ,price money);

insert into produtc values(1,15);--向表中新增id為1,**為15的商品

事務1中

begin transaction tran1

declare @price money

select @price=price

from production

where productid=1

waitfor delay '00:00:30'--延遲30秒

if @price>10

begin

update product

set price=price-10

where productid=1

endcommit

在事務2中寫入

begin transaction tran2

update product

set price=price*0.6

where prodcutid=1

commit

如果先執行事務1 ,在30秒之內執行事務2那麼,該錶price欄位的值變為-1.

為了控制這一事情的發生可以新增可重複讀的隔離級別來控制它(個人理解彷彿是更新update的事務控制)在select 字段 from 表的時候加上with (updlock)

再例如:新增員工表。新增4位員工。現在有100元獎金分配到組號是10的員工裡面。

create table myemployees(employeeid int,groupid int,salary money)

create clustered index i1 on dbo.myemployees(groupid)

insert into dbo.myemployees values(1,10,1000)

insert into dbo.myemployees values(2,10,1000)

insert into dbo.myemployees values(3,20,1000)

insert into dbo.myemployees values(4,30,1000)

declare @fund money=100,@bonus money,@numberofemployees int

begin tran paybonus

select @numberofemployees=count(*)

from dbo.myemployees

where groupid=10

--篩選出10的組號

waitfor delay '00:00:30'

if @numberofemployees>0

begin

set @bonus=@fund/@numberofemployees

update dbo.myemployees

set salary=salary+@bonus

where groupid=10

print '獎金剩餘'+cast(@fund-(@@rowcount*@bonus) as varchar(6))

endcommit

新建事務2,往表中新增位員工,剛好該員工組號為10

begin tran newemployee

insert into dbo.myemployees values(8,10,1000)

commit

最後顯示獎金的剩餘-50。因為在執行分配獎金的時候,插入了新員工。

此時可以用可序列化隔離級別來控制(可序列化彷彿就是插入語句的事務控制)在select 字段 from 表的時候加上with (holdlock)

資料庫隔離級別理解

1.為什麼要選擇隔離級別?通過例子說明隔離級別的必要性 假設乙個場景,一對夫妻共用乙個賬戶,妻子喜歡網上支付,丈夫喜歡刷卡支付。第一類丟失情況 整個過程中只有老公消費1000元,而最後時刻,老婆回滾事務,恢復到了原來的10000元,這不符合實際。這樣的兩個事務併發,乙個提交,乙個回滾導致的不一致成為...

資料庫事務隔離級別理解

資料庫事務的隔離級別有4個,由低到高依次為 read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted r...

SQL 92 隔離級別理解和測試

以前對資料庫的隔離級別,有所了解,但不知道真正其中的區別。今天就討論一下這4個隔離級別 下面是4個隔離級別,在sql server 2005裡的介紹 read uncommitted 指定語句可以讀取已由其他事務修改但尚未提交的行。read committed 指定語句不能讀取已由其他事務修改但尚未...