存在即更新反之插入的三種防唯一鍵衝突和死鎖的寫法

2022-02-05 03:31:53 字數 1154 閱讀 4636

[轉

存在即更新,反之插入的需求是很常見的,很多人沒有注意併發的問題,高併發下為了避免唯一鍵衝突和死鎖情況,下面提供三種寫法,最後乙個是sql server 2008及以後版本適用。

示例表為:

use tempdb

gocreate

table tb_1 (id int

identity

primary

key,a varchar(50),dt datetime

default

getdate())

go寫法一:

begin

tran

ifexists (select

*from tb_1 with (updlock,serializable) where id=

100)

begin

update tb_1 set a=

'a100

'where id=

100end

else

begin

insert tb_1 (a) values ('

a100

')end

commit

tran

寫法二:

begin

tran

update tb_1 with (serializable) set a=

'a100

'where id =

100if

@@rowcount=0

begin

insert tb_1 (a) values ('

a100

')end

commit

tran

寫法三:

begin

tran

merge tb_1 with(serializable) as a

using(select

100as id) as b on a.id=b.id

when matched then

update

set a=

'a100

'when

not matched then

insert (a) values ('

a100

');commit

tran

PHP生成唯一ID的三種方法

1 md5 time mt rand 1,1000000 這種方法有一定的概率會出現重複 2 php內建函式uniqid uniqid 函式基於以微秒計的當前時間,生成乙個唯一的 id.w3school參考手冊有一句話 由於基於系統時間,通過該函式生成的 id 不是最佳的。如需生成絕對唯一的 id,...

Java三種獲取獲取唯一值的方法

第一種方式 通過nanotime 方法獲得 通過system類的nanotime 方法產生,理論上存在重複的可能,實際不會重複 public string uniquecodeone 第二種方式 通過uuid類 表示通用唯一識別符號的類 獲得唯一值,uuid表示乙個128位的值 public str...

鍊錶中插入乙個節點的三種情況

在鍊錶中插入乙個元素可以分為三種情況 1 在節點的時候 2 在鍊錶中間的任意位置 3 在鍊錶的最後位置,也可以認為這種情況為追加 這個就留到追加的時候來實現 下面是 的實現 sn insert s node sn head 傳入的引數是被插入鍊錶中的頭指標 sn insert node null,d...