iT邦幫忙

0

SQL Concurrency Problem

Ks 2019-08-30 17:08:222284 瀏覽
  • 分享至 

  • xImage

想請教SQL對於Concurrency的觀念和問題,

有一張資料表裡面有個Balance記錄著用戶的存款,

然後可能會在不同的地方(Store Procedure或其他地方)更新這個Balance,

會扣款或者充值等等,

因為之前有在C#處理過Concurrency的,那时候因为多线程的情况被要求进行这样的处理,

但是现在把Logic写在Store Procedure里面,

不確定在SQL這裡會不會有這樣的Concurrency的問題嗎?

如果有的話,請問改怎麼解決?

謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
暐翰
iT邦大師 1 級 ‧ 2019-08-30 17:15:25
最佳解答

SQL處理Concurrency最大問題就是髒資料跟Lock問題,最簡單、有效方式是transation,而且Store Procedure也有提供該功能

以sql server為例子

BEGIN TRANSACTION;
Update 表格1 Set 欄位 = 新值 Where Id = 'XXXX'
Update 表格2 Set 欄位 = 新值 Where Id = 'XXXX'
COMMIT TRANSACTION;

在更新該筆資料時,其他人是無法更新的,只能等到更新完後才能更新

Ks iT邦新手 3 級 ‧ 2019-08-30 17:52:09 檢舉

謝謝答复
所以一開始註明Begin Transaction,
最後沒有Commit Transaction的話,
其他人就無法去update那一筆rows?
DB是postgresql

https://docs.postgresql.tw/the-sql-language/concurrency-control/transaction-isolation

參考以上資料.期待你做一些測試,然後再將過程及結果與大家分享.
加油!

小魚 iT邦大師 1 級 ‧ 2019-08-30 18:27:33 檢舉

Transaction在做很多專案都會用到,
算是很常用的功能.

我要發表回答

立即登入回答