關於髒讀與唯一約束

2021-07-15 13:20:35 字數 748 閱讀 5299

sql server 2012

案例:create table dbo.test

(id int identity,num int,uqno int);

alter table test add constraint pk_test primary key (id);

create unique index ix_test_uqno on test (uqno);

process 1:

insert dbo.test (num,uqno) values (100,100);

insert dbo.test (num,uqno) values (100,100);  --因為uqno重複,所以最終是要報錯的

process 2:

select * from dbo.test with (nolock) where num=100; --可能得到2條記錄

若 process 2在 process 1的第2個sql發出後,且在其因為唯一索引約束報錯前執行,

則會得到2條記錄。比如process 1的第2個sql是 00:00:00.100 毫秒執行,在00:00:00.500毫秒報錯,

當process 2在 00:00:00.200毫秒執行,就能查詢出2條記錄

按此推理,資料寫入過程:

寫資料記憶體頁->寫索引記憶體頁,若唯一索引重複,報錯,就回滾資料記憶體頁->寫日誌檔案

感覺這處理得有點怪怪的。是不是該先檢查資料正確(無違反唯一索引及其他約束等),再行寫入?

MySQL 新增唯一約束和聯合唯一約束

在mysql資料庫中,經常會碰到由於業務需要新增唯一鍵約束,唯一鍵約束,可以在乙個列上新增約束,也可以在多個列上新增唯一約束。1.建表時加上唯一性約束 create table t user id int 11 notnull auto increment username varchar 18 n...

db2唯一索引與唯一約束,重複刪除唯一約束儲存過程

db2唯一索引與唯一約束,重複刪除唯一約束儲存過程 今天寫可重複執行的指令碼時,發現沒有重複刪除約束的儲存過程,寫此紀錄。先建立唯一約束會自動建立唯一索引且兩者名字相同,若該字段上已有索引,再次建立索引的語句無效,此時第二句話無效。先建立唯一索引不會建立唯一約束,在執行建立唯一約束,此時兩者名字不同...

唯一約束,主鍵約束,唯一索引

1.unique約束和primary key約束用來保證同一表中指定的列上沒有重複值,這兩個約束都產生唯一索引確保資料一致性,預設情況下,unique約束產生唯一的非聚集索引,primary key約束產生唯一的聚集索引。primary key約束比unique約束嚴格 primary key列不允...