如何設定 sybase 的 lock time out

最近處理的案子有點複雜,當中遇到一個狀況,在思考了很多解決方案後,最後決定把timeout機制放在資料庫上。

簡單的說,當啟動transaction後,為了避免transaction內的table因lock,導致程式無法正常反應。所以需要一個timeout機制。

基於MS SQL的經驗,記憶中可以設定lock time out時間。不過,此次配合的資料庫為Sybase,於是查了一下官方的文件…看到有三種作法
  1. wait/nowaitoption of the lock tablecommand
  2. session-level lock-wait limit
  3. server-wide lock-wait limit
以我的案例,session-level lock-wait limit是三者中比較好的選擇。指令如下…
  1. set lock {wait no_of_seconds | nowait}  
應用方式如下…(指令不全,僅供參考)
  1. set lock wait 5   
  2. begin transaction   
  3. update mydb..mytable set f1=1 where key=1  
  4. --以下省略…  
實際測試結果…當我刻意讓 mydb..mytable 發生lock後,去執行上述SQL statement。當time out發生,程式會收到下面的錯誤,並結束運作。
  1. Could not acquire a lock within the specified wait period. SESSION level wait period=5 seconds, spid=391, lock type=exclusive row, dbid=18, objid=2051597914, pageno=50303191, rowno=2. Aborting the transaction.  
以這案例,在不同平台下,其實會有不同的解決方案(方法真的很多種…)。對我的案例來說,這可能是比較好的解決方案…

留言