想請教SQL對於Concurrency的觀念和問題,
有一張資料表裡面有個Balance記錄著用戶的存款,
然後可能會在不同的地方(Store Procedure或其他地方)更新這個Balance,
會扣款或者充值等等,
因為之前有在C#處理過Concurrency的,那时候因为多线程的情况被要求进行这样的处理,
但是现在把Logic写在Store Procedure里面,
不確定在SQL這裡會不會有這樣的Concurrency的問題嗎?
如果有的話,請問改怎麼解決?
謝謝
SQL處理Concurrency最大問題就是髒資料跟Lock問題,最簡單、有效方式是transation
,而且Store Procedure也有提供該功能
以sql server為例子
BEGIN TRANSACTION;
Update 表格1 Set 欄位 = 新值 Where Id = 'XXXX'
Update 表格2 Set 欄位 = 新值 Where Id = 'XXXX'
COMMIT TRANSACTION;
在更新該筆資料時,其他人是無法更新的,只能等到更新完後才能更新
謝謝答复
所以一開始註明Begin Transaction,
最後沒有Commit Transaction的話,
其他人就無法去update那一筆rows?
DB是postgresql
https://docs.postgresql.tw/the-sql-language/concurrency-control/transaction-isolation
參考以上資料.期待你做一些測試,然後再將過程及結果與大家分享.
加油!
Transaction在做很多專案都會用到,
算是很常用的功能.