事務的隔離性

2021-08-31 02:45:27 字數 1826 閱讀 3948

例如:統計定單系統中事務活動 如下

1.事務t1列印定單表中的記錄

2.t2向定單表插入了新的定單,t2提交

3.事務t1統計定單表中的的記錄總數,t1提交

因為事務t2在t1結束前向定單表中插入了新的記錄,導致事務t1列印的定單記錄數量和t1統計的定單數量不一致.

產生併發異常問題的主要原因是併發操作破壞了事務的隔離性,導致資料不一致.如何使乙個事務不受到其它事務的干擾,保證資料一致性???

如何鎖乙個表的某一行

a 連線中執行

set transaction isolation level repeatable read

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay "00:00:05"

commit tran

b連線中如果執行

update tablename set colname="10" where id=3 --則要等待5秒

update tablename set colname="10" where id<>3 --可立即執行

3. 鎖定資料庫的乙個表

select * from table with (holdlock)

注意: 鎖定資料庫的乙個表的區別

select * from table with (holdlock)

其他事務可以讀取表,但不能更新刪除

select * from table with (tablockx)

其他事務不能讀取表,更新和刪除

select 語句中「加鎖選項」的功能說明

sql server提供了強大而完備的鎖機制來幫助實現資料庫系統的併發性和高效能。使用者既能使用sql server的預設設定也可以在select 語句中使用「加鎖選項」來實現預期的效果。 本文介紹了select語句中的各項「加鎖選項」以及相應的功能說明。

功能說明: 

nolock(不加鎖)

此選項被選中時,sql server 在讀取或修改資料時不加任何鎖。 在這種情況下,使用者有可能讀取到未完成事務(uncommited transaction)或回滾(roll back)中的資料, 即所謂的「髒資料」。

holdlock(保持鎖)

此選項被選中時,sql server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。

updlock(修改鎖)

此選項被選中時,sql server 在讀取資料時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個程序能同時讀取資料但只有該程序能修改資料。

tablock(表鎖)

此選項被選中時,sql server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他程序只能讀取而不能修改資料。

paglock(頁鎖)

此選項為預設選項, 當被選中時,sql server 使用共享頁鎖。

tablockx(排它表鎖)

此選項被選中時,sql server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他程序讀取或修改表中的資料。

這樣的鎖是沒有問題,但這樣鎖住後,其他的使用者要操作的話,都只能等待(堵塞其他使用者程序,嚴重的產生死鎖)

--示例

begin tran --開始事務

--查詢出要列印的資料

select * from 表 with(tablockx) --加鎖,阻止其他使用者讀取或操作表

--這裡進行你列印

rollback tran

drop table tb

事務隔離性

事務a 讀取事務b更新的資料,然後事務b回滾,那麼a讀取到的資料就是髒資料 情景展示 1.會話b 可提交讀 set session transaction isolation level read uncommitted begin update account set balance balanc...

事務的隔離性

事務有四大特性 原子性 一致性 隔離性 永續性。其中事務的隔離比較重要,事務隔離性處理在資料併發量較大的系統顯得比較重要。資料庫在事務隔離這塊提供了四種事務隔離級別,分別是 讀取未提交內容 read uncommitted 讀取已提交內容 read committed 可重讀 repeatable ...

Mysql 事務隔離性

事務併發所引起的跟讀取資料有關的問題,各用一句話來描述一下 1.髒讀 事務 a 讀取了事務 b 未提交的資料,並在這個基礎上又做了其他操作。讀取未提交 2.不可重複讀 事務 a 讀取了事務 b 已提交的更改資料。讀取新提交update 3.幻讀 事務 a 受到事務 b 已提交的新增資料影響。看不到已...