場景:
在開發某活動時,一個用戶只能參與一次,因此insert之前要判斷數據庫是否存在數據,若不存在插入,若存在不操作。但是當請求並發時,數據庫insert操作尚未執行,這樣select的結果為用戶未參與,導致插入了多條數據。
思路:
第一次select、insert必須要執行完畢,才能進行第二次。
解決方案:
一、
1 INSERT INTO TABLE_NAME (createDate,字段2,字段3,字段4,user_id) 2 SELECT now(),值2,值3,值4 ,#{user_id} FROM TABLE_NAME WHERE 3 NOT EXISTS (SELECT * FROM TABLE_NAME WHERE DATE(createDate)=DATE(now()) AND user_id = #{user_id})
二、
1 begin tran 2 declare @count int =0 3 select @count=[Count] from tb_name WITH(UPDLOCK,HOLDLOCK) where id=1 4 select @count as count1 5 waitfor delay '00:00:30' 6 update tb_name set [Count]=@count+1 where id=1 7 commit tran 8 select * from tb_name
