資料庫的六種隔離級別的自我理解:
隔離級別(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 指定語句不能讀取已由其他事務修改但尚未...