1. 程式人生 > >淺談 SQL 中的鎖(二)餘額問題的處理

淺談 SQL 中的鎖(二)餘額問題的處理

上次模擬了 SQL 中併發執行更新餘額的語句,出現餘額負數的問題:

http://blog.csdn.net/closurer/article/details/54288628

現在說說它的解決方法。

事務要正確地執行,就需要【隔離性】這個基本要素。更新餘額的語句之所以會偏離期望的結果,是由於查詢並沒有互斥,也就是沒有相互隔離:

--檢查使用者的餘額是否足夠
if(exists(select * from balance where id = 1 and value >= 1))

這個查詢語句在預設的情況下,會對查詢的資料放置共享鎖,當併發的時候,兩個共享鎖並不互斥,所以兩個併發的操作都得到餘額足夠的結果。

那麼,要解決這個問題,就需要兩個條件:

一、檢查餘額是否足夠的語句要互斥。

二、互斥要持續到完成餘額的更新。

於是,我把 SQL 修改成這樣:

--開始事務
begin transaction

--檢查使用者的餘額是否足夠
if(exists(select * from balance(updlock) where id = 1 and value >= 1))
begin
	--延長處理時間
	waitfor delay '0:00:10'

	--更新餘額
	update balance set value = value - 1
end

--提交事務
commit transaction

--檢視處理結果
select * from balance

對應上面的條件,語句做了兩處修改:

一、在 select * from balance 後面添加了表提示 (updlock),指定對查詢的資料放置更新鎖。在併發的時候兩個更新鎖是會互斥的。

二、在整個更新語句的範圍指定使用同一個事務,使放置的更新鎖持續到整個操作結束。也就是在併發的時候,對同一個使用者的餘額更新,是序列執行的,只有當一個操作結束,另一個操作才會開始。

這樣就杜絕了餘額負數的問題。

在這個例子中,我並沒有更改 SQL Server 的預設隔離級別 read committed。SQL Server 還有兩個更高的隔離級別 repeatable read 和 serializable,什麼時候才用到呢?

下次再寫。

相關推薦

SQL 餘額問題的處理

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

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

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

Java程式碼安全

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

SQL 如何生成自定義的自增 ID

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

SQL 餘額問題

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

SQL夯實基礎:連接操作使用on與where篩選的差異

img 範圍 ins name -s insert 如何 篩選條件 utf 一、on篩選和where篩選   在連接查詢語法中,另人迷惑首當其沖的就要屬on篩選和where篩選的區別了,如果在我們編寫查詢的時候, 篩選條件的放置不管是在on後面還是where後面, 查出來

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 使用鎖來確保事務的獨立性,鎖可以為某個事務鎖定資源,防止事務間就訪問統一

深入理解Java

locks包結構層次 Lock 介面 方法簽名描述 void lock(); 獲取鎖(不死不休) boolean tryLock(); 獲取鎖(淺嘗輒止) boolean tryLock(long time, TimeUnit unit) throw

Django模型

for 唯一值 校驗 允許 小數 如果 git ade 字符長度 Django中模型(二) 三、定義模型 1、模型、屬性、表、字段間的關系: 一個模型類在數據庫中對應一張表;在模型類中定義的屬性,對應該模型對照表中的字段。 2、定義屬性 A、概述

PL/SQL 上機練習

tinc ace end from func fun gin spa PE 函數:1. 函數查看字符串中共包含幾個某特殊字符,如‘A**B*CEDF‘中包含幾個‘*’ 2.函數把員工表中不同的工作連接成一個字符串 3.函數計算個人所得稅,工資,薪金所得減3500, 含稅

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

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

在平衡樹的海洋暢遊——Scapegoat Tree

har 個數 bst 表示 檢查 png turn utc 重構 在平衡樹的廣闊天地中,以Treap,Splay等為代表的通過旋轉來維護平衡的文藝平衡樹占了覺大部分。 然而,今天我們要講的Scapegoat Tree(替罪羊樹)就是一個特立獨行的平衡樹,它通過暴力重構來維護

Spark SQL筆記整理:DataFrame編程模型與操作案例

代碼 最重要的 ssi func nbu 產生 michael array image DataFrame原理與解析 Spark SQL和DataFrame 1、Spark SQL是Spark中的一個模塊,主要用於進行結構化數據的處理。它提供的最核心的編程抽象,就是Data

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第七章:在Direct3D繪製

程式碼工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 學習目標 理解本章中針對命令佇列的更新(不再需要每幀都flush命令佇列),提高效能; 理解其他兩種型別的根訊號引數型別:根描述

Redtiger SQL注入練習

第六關: 點選 click me,構造url:user=1',返回user not found。user=1'',同樣。 猜測是數字型注入,構造order by , user=1 order by  X#,得出有5個欄位。 然後,user=0 union select 1,2,3,4,5#,說

分散式__基於資料庫實現

原理介紹: 要基於資料庫實現分散式鎖,最簡單的方式可能就是直接建立一張鎖表,然後通過操作該表中的資料來實現。 當需要鎖住某個方法或資源時,就在該表中增加一條記錄,想要釋放鎖的時候就刪除這條記錄 問題: 1.這把鎖依賴資料庫的可用性,資料庫是一個單點,一旦資料庫掛掉,會導致業務系統

前端效能優化

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

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

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