成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

并發數據庫中丟失修改問題的解決措施詳解

數據庫 SQL Server
本文我們以火車售票系統為例介紹了并發數據庫中丟失修改問題的解決思路以及解決措施,希望能夠對您有所幫助。

并發數據庫丟失修改問題的解決措施是本文我們主要要介紹的內容,接下來我們就從一個簡單的例子開始介紹這部分內容,希望能夠對您有所幫助。

1.問題定義

先從一個較簡單的例子為例,如火車售票系統,數據庫表(車次,剩余票數),一個售票事務的處理過程如下:

(1) 查詢該車次剩余票數x=16。

(2) x = x – 1,得x=15

(3) 將x=15寫回該車次剩余票數。

這樣一個事務在串行運行的數據庫系統中是沒有問題的,如果兩個事務串行運行,各售一張票,最終結果為14。但如果在并行系統中,可能會有兩個售票事務實例同時執行,由于CPU分時間片輪流執行事務,這時有可能發生如下情況(執行次序自上而下,兩個事務交叉運行):

售票事務T1 售票事務T2

(1) 查詢剩余票數x=16

(2) 查詢剩余票數x=16

(3) x=x-1,得x=15

(4) 將x=15寫回數據庫。

(5) x=x-1,得x=15

(6) 將x=15寫回數據庫。

即T1先查詢出了剩余票數16,此時它把控制權交給CPU,等待分配下一個時間片執行。然后T2獲得了執行權,查出票數依然是16。然后T1和T2不管如何輪換執行,售出一張票后(售多張票是類似的),都將得到結果15。那么后一個事務提交的數據就覆蓋了前一個事務的數據,最終結果是15,這就是所謂的丟失修改問題。

這個問題在分布式數據庫中具有一般性,其它的例子如申請手機號時,兩個用戶同時申請同一個手機號的問題,本文中我們給出這類問題的一個通用解決方案。(火車售票例子太簡單,還是比較容易解決的,沒必要用本文所述的一般性的方法,呵呵)。

2.思路

我們可以采用一個時間戳字段記錄哪個事務先修改的記錄。時間戳不是一個時間,而類似于一個自動增長字段,但它有一個特點,就是每次更新某條記錄時,會自動更新為一個新的時間戳數據。在SQL Server中,設置為一個字段為timestamp數據類型,讀取時可以使用varbinary類型讀取。

主要思路是:讀取剩余票數時就同時讀取該記錄的時間戳,當更新記錄時,判斷時間戳是否與原來讀取的相同,如果不同,說明已經有一個事務修改了這條記錄,就讓當前事務失敗。

這樣我們把數據庫表修改為:車次表(車次,剩余票數,修改時間)。注意修改時間字段設置為timestamp類型,不允許為空,這樣初始化時就先自動生成了一個時間戳。

3.解決方案

售票的存儲過程:

 

  1. Create Procedure Sale  
  2.  
  3. (@Serial varchar(10), -- 車次  
  4.  
  5. @SaleCount int -- 所售票數  
  6.  
  7. ) As  
  8.  
  9. -- 取出剩余票數  
  10.  
  11. Declare @RealCount int, -- 剩余票數  
  12.  
  13. @Time varbinary(6) -- 時間戳  
  14.  
  15. Select @RealCount=剩余票數, @Time=修改時間 From 車次表 Where 車次=@Serial  
  16.  
  17. -- 判斷票數是否夠  
  18.  
  19. If (@SaleCount > @RealCount)  
  20.  
  21. Begin  
  22.  
  23. Print ‘票數不夠’  
  24.  
  25. return  
  26.  
  27. End  
  28.  
  29. -- 更新數據  
  30.  
  31. Declare @RowsCount int -- 更新時影響的行數  
  32.  
  33. Update 車次表 Set 剩余票數=剩余票數-@SaleCount  
  34.  
  35. Where 車次=@Serial and 修改時間=@Time  
  36.  
  37. Set @RowsCount=@@RowsCount  
  38.  
  39. /* @@RowsCount記錄了修改最近一條SQL語句影響的行數,如果為1,表示修改成功,如果為0,表示未修改任何行,出現這種情況的原因就是其它事務已經修改了這條記錄,造成修改時間這個自動的值變化了 */  
  40.  
  41. -- 判斷結果  
  42.  
  43. If (@RowsCount = 0)  
  44.  
  45. Print ‘事務并發造成的修改失敗’  
  46.  
  47. Else  
  48.  
  49. Print ‘售票成功  
  50.  
  51. Go 

 

4.測試

測試時我們創建另外一個售票的存儲過程SaleDelay,與上面的Sale存儲過程不同的是,在取出票數之后增加一個延時語句,比如延時10秒。

Waitfor Delay ‘0:0:10’

先啟動SaleDelay,然后快速啟動Sale,這樣SaleDelay因為讀取后10s才去寫數據,這期間Sale已經寫入了數據,SaleDelay會失敗。

測試技巧:在查詢分析器中打開兩個窗口,***選用橫向平鋪讓兩個窗口都顯示出來。兩個窗口分別輸入exec SaleDelay ‘車次x’ 1和exec Sale '車次x’ 1,注意兩個車次號要相同。先點擊***個窗口,然后點執行;然后迅速點第二個窗口,點執行,等待執行結果。

關于并發數據庫中丟失修改問題的解決措施的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

【編輯推薦】

  1. 初學SQL Server數據庫的一些常用操作總結
  2. 初學SQL Server筆記之修改表結構的示例代碼
  3. SQL Server批量修改字段的數據類型的代碼實例
  4. SQL Server數據庫字段說明的添加修改刪除示例
  5. SQL Server 2005數據庫中設置自動編號字段實例解析

 

責任編輯:趙鵬 來源: CSDN博客
相關推薦

2024-05-08 08:14:18

數據庫IO備份

2010-07-06 14:40:15

解決SQL Serve

2010-04-21 12:13:44

Oracle數據庫

2011-05-24 10:26:12

Oracle數據庫日志文件

2011-07-28 16:39:03

MySQL數據庫修改MySQL密碼

2011-05-26 09:46:21

Oracle數據庫安全

2011-07-18 09:36:42

Mysql數據庫root@localh

2010-07-08 11:05:14

SQL Server數

2009-11-04 12:37:32

ADO.NET SQL

2024-12-16 00:52:26

MySQL數據庫并發

2010-08-18 11:11:36

路由器報文

2025-01-02 08:00:00

SQL數據庫恢復階段

2010-04-12 16:43:59

Oracle數據庫

2011-04-07 09:06:27

MySQL數據庫密碼

2011-08-05 11:01:15

MySQL數據庫設計

2010-09-08 16:03:57

SQL臨時表數據庫

2018-07-30 15:00:05

數據庫MySQLJOIN

2010-07-05 14:41:21

SQL Server數

2010-05-11 12:57:45

MySQL數據庫編碼

2011-07-06 14:09:40

ASP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 仙人掌旅馆在线观看 | 午夜男人天堂 | 在线不卡一区 | 午夜免费网站 | h视频免费观看 | a级黄色片视频 | 九九精品视频在线 | 国产91在线播放精品91 | 黄色av网站在线免费观看 | 亚洲午夜网 | 亚洲一区二区三区四区在线观看 | 亚洲精品成人在线 | 亚洲社区在线 | 久久久久久久一区二区三区 | 久久精品免费一区二区三 | 国产精品成av人在线视午夜片 | 免费av毛片 | 在线视频日韩 | 男女国产网站 | 91免费版在线观看 | 欧美一区2区三区4区公司二百 | 国产欧美精品一区二区色综合朱莉 | 国产精品成人一区二区三区 | 欧美aⅴ| 久久久av| 波多野吉衣久久 | 97精品超碰一区二区三区 | 亚洲国产精品久久久久 | 国产精品一区在线观看 | 国产伊人精品 | 久久久这里都是精品 | 日韩毛片 | 欧美影院久久 | 欧美中文字幕一区二区三区亚洲 | 毛片网在线观看 | 又黄又爽的网站 | 欧美激情综合网 | 一区二区三区在线 | 看一级黄色毛片 | 色综合99| 日韩欧美一区二区三区四区 |