1. 程式人生 > >淺談 SQL 中的鎖(七)如何生成自定義的自增 ID

淺談 SQL 中的鎖(七)如何生成自定義的自增 ID

在 SQL 表設計中,自增 ID 的使用很廣泛。因為有些資料的屬性並不具有唯一性,所以要給它加上一個生成的主鍵。生成主鍵最方便的方式,就是採用 SQL 產品提供的自增 ID 功能。可能自增 ID 的使用太過方便了,現在大有氾濫的趨勢,甚至有資深的工程師說:所有的表都應該有一個自增的主鍵。

不過 SQL 產品的自增 ID 功能,一般都只使用簡單的自增整型,就是第一行記錄的 ID 是 1,第二行記錄的 ID 是 2,如此類推。有時候我們會希望 ID 帶有除序號之外額外的資訊,比如希望使用者的 ID 帶有其部門簡寫:人事部的員工以 HR 做字首;資訊部的員工以 IT 做字首:

123456789create
table app_user(id char(5) primary key,dept char(2),number int)insert app_user values('HR001', 'HR', 1)insert app_user values('IT001', 'IT', 1)

面對這樣的需求,一般的處理邏輯是:先找出對應部門的最大 ID,把這個 ID 的序號部分加 1,作為新使用者的 ID 新增到使用者表中:

123456789101112declare @id char(5)declare @dept char(2)declare @number intset @dept = 'HR'select
@number = max(number) + 1 from app_user where dept = @deptset @id = @dept + right('00' + convert(varchar(3), @number), 3)insert app_user values(@id, @dept, @number)

很明顯,上面的程式碼在併發的時候會出現問題,因為計算新的 ID 和插入記錄是兩個獨立的事務,在這兩個事務之間,新的 ID 可能會被佔用了。加入延時的程式碼,在兩個連線中執行同樣的語句:

123456789101112131415declare @id char(5)declare
@dept char(2)declare @number intset @dept = 'HR'select @number = max(number) + 1 from app_user where dept = @deptset @id = @dept + right('00' + convert(varchar(3), @number), 3)--延長處理時間waitfor delay '0:00:10' insert app_user values(@id, @dept, @number)

可以看到後執行的連線插入記錄失敗:

原因就是 ID 已經被先執行的連線佔用了。

實際上,解決這個問題方法,和之前寫的重複使用者問題的解決方法是一樣的:

關鍵就是在生成 ID 的時候加上範圍鎖:

123456789101112131415161718192021222324declare @id char(5)declare @dept char(2)declare @number intset @dept = 'HR'--開始事務begin transaction--設定序列式事務set transaction isolation level serializableselect @number = max(number) + 1 from app_user(updlock) where dept = @deptset @id = @dept + right(

相關推薦

SQL 如何生成定義 ID

在 SQL 表設計中,自增 ID 的使用很廣泛。因為有些資料的屬性並不具有唯一性,所以要給它加上一個生成的主鍵。生成主鍵最方便的方式,就是採用 SQL 產品提供的自增 ID 功能。可能自增 ID 的使用太過方便了,現在大有氾濫的趨勢,甚至有資深的工程師說:所有的表都應該有一個

SQL 餘額問題的處理

上次模擬了 SQL 中併發執行更新餘額的語句,出現餘額負數的問題:http://blog.csdn.net/closurer/article/details/54288628 現在說說它的解決方法。 事務要正確地執行,就需要【隔離性】這個基本要素。更新餘額的語句之所以會偏離

SQL 餘額問題

這兩天看到資料庫的資料一致性和鎖定的問題:http://bbs.csdn.net/topics/392072953http://bbs.csdn.net/topics/392073296 寫一個帖子專門說說這個。 舉一個使用者餘額的例子,餘額可以是現金、虛擬幣、積分等,可以

ZooKeeper分散式來自LJ

目前的應用系統,大部分都是分散式部署的,分散式應用中的資料一致性問題是每個系統都要面臨的問題,分散式的CAP理論告訴我們“一個分散式系統不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)和分割槽容錯性(P:Partition toler

AndroidCallback回撥的使用

今天專案的Bug基本修改完成了,於是就對自己還未了解的回撥函式進行了學習。回撥其實就是在一定的時間裡做“一件事”,至於“這件事”具體做的是什麼不會管,只管做“這件事“,比如Boss叫員工去吃飯,但每個員工可能吃不同的食物。只不過,回撥是對介面而言。簡單來說就是,A物件呼叫

Sql

轉自:http://blog.csdn.net/abrahamcheng/article/details/6216428 淺談Sql 中的鎖 1.鎖的概念            Sql server 使用鎖來確保事務的獨立性,鎖可以為某個事務鎖定資源,防止事務間就訪問統一

數據庫SQL Server2012筆記——java 程序操作sql server

jdb 統一 col select 封裝 query size api color 1、crud(增刪改查)介紹:create/retrieve/update/delete 2、JDBC介紹 1)JDBC(java database connectivi

線程池:相關試驗及註意事項

DG 執行 html ble DC resp lin 不足 4.0 三個月,整整三個月了,我忽然發現我還有三個月前的一個小系列的文章沒有結束,我還欠一個試驗!線程池是.NET中的重要組件,幾乎所有的異步功能依賴於線程池。之前我們討論了線程池的作用、獨立線程池的存在意義,以及

前端效能優化——對HTTP傳輸進行壓縮

1、前端效能優化的一點: 對js、css、圖片等進行壓縮,儘可能減小檔案的大小,減少檔案下載的時間,從而減少網頁響應的時間。   2、前端效能優化的另一點: 對HTTP傳輸進行壓縮,即在js,css、圖片等資源已經壓縮的基礎上(其實,檔案的壓縮與否均可,檔案的壓縮跟HTTP傳輸過程的壓縮沒關

前端效能優化

前端效能優化中,減少HTTP請求可以提高頁面的響應速度。 瀏覽器在第一次訪問頁面時向伺服器請求資源,並快取起來,下次再訪問時會判斷在快取中是否已有該資源且有沒有更新過,如果已有該資源且未更新過,則直接從瀏覽器快取中讀取。原理:通過HTTP 請求頭中的 If-Modified-Since(If-No-Matc

JavaSE效能優化1——BufferedImage與畫素級渲染

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

斜率優化DP總結

前幾天洛谷的智障推薦一直都很智障,於是我就去隨機跳題,跳到一題斜率優化DP o(╥﹏╥)o 跳到了不會做?這個就很難受了。不服,看題解,勉強學會,結果一發不可收拾 這幾天連著刷,感覺是時候寫一篇總結了 然而,我懶得畫圖(逃 放一個連結吧,就是第一篇,講得非常好 不過還要提醒一下像

指令碼化css

讀寫css屬性 每一個dom元素都有一個屬性style,dom.style裡面存放的這個元素的行間樣式,我們可以通過這個屬性來讀寫元素的行間樣式。 注意: 1.我們碰到float這樣的關鍵字屬性的時候,前面要加一個css字首。 float—>cssFloat 2.複合屬性必須拆解 borde

Java程式碼安全

先來看一段程式碼: //x, y, z 都是 int 型別 if (x + y < z) { } 這段程式碼是否存在問題呢,可能不仔細或者對資料結構不充分了解的同學就直接這麼過了,當然大多數情況下可能這段程式碼也不會產生問題,但是還是那句話,安全傾向於 “明顯沒

sql的in與not in,exists與not exists的區別以及效能分析

1、in和exists in是把外表和內表作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查

計算機基礎知識

資料的邏輯結構:反映資料元素之間的關係的資料元素集合的表示。資料的邏輯結構包括集合、線形結構、樹形結構和圖形結構四種。 資料的儲存結構:資料的邏輯結構在計算機儲存空間種的存放形式稱為資料的儲存結構。常用的儲存結構有順序、連結、索引等儲存結構。 插入和刪除是對資料結構

貨幣流向深淵——Bancor的意義1

前言:所有數字貨幣從誕生的第一天起就在對抗一個可怕敵人,它既是死神,也是一個詛咒。想象一下,很多年以後,比特幣的去中心化宣言或已經成為笑柄。因為那時的世界,財富由最早期的比特幣礦工把持,他們的先發優勢已經永遠無法用努力來抹平,人們會不會拋棄這個數字貨幣之王,重新洗牌?這個

測試驅動開發TDD

在 IBM Bluemix 雲平臺上開發並部署您的下一個應用。 背景 一個高效的軟體開發過程對軟體開發人員來說是至關重要的,決定著開發是痛苦的掙扎,還是不斷進步的喜悅。國人對軟體藍領的不屑,對繁瑣冗長的傳統開發過程的不耐,使大多數開發人員無所適從。最近興起的一些軟體開發過程相關的技術,提供一些比較高效、

分詞演算法4基於字的分詞方法CRF

目錄 前言 目錄 條件隨機場(conditional random field CRF) 核心點 線性鏈條件隨機場 簡化形式 CRF分詞 CRF VS HMM 程式碼實現 訓練程式碼 實驗結果 參考文獻

單元測試之:單元測試的意義

單元測試是檢查一個獨立工作單元的行為。在JAVA應用程式中,獨立工作單元經常是(但不總是)一個獨立的方法。相比之下,整合測試和驗收測試檢查的是各種元件如何互動。一個工作單元就是一項任務,不直接依賴於其