2013年6月6日 星期四

Coldfusion Query 的 Commit

最近由coldfusion 操作資料庫查詢時發生的一件事情
在sybase資料庫 做 Replication 的兩部資料庫: A-DB 與 B-DB,
本來,Web-Base的作業都連線在 B-DB 上,App-Base都連在 A-DB上
後來因為B-DB資料區有異常,就把 coldfusion 連線全部連到 A-DB ,
接下來,慘事發生了......
A-DB 三不五時發生嚴重 lock ,導致所有作業都停擺,細查原因,發現:
1、全部 lock 都是來自 coldfusion 的 connection ,而且都是 jdbc 驅動連線
2、如果 coldfusion 使用 Sybase 驅動連線,不會發生此現象
3、ColdFusion 不管何種連線到 B-DB 都不太會發生 lock 過久問題
4、Web-Base 的查詢幾乎都是大範圍資料查詢

所以,查了一下設定發現,B-DB 的 lock 範圍強制設定在 row lock等級,
Read isolation 屬 uncommit ,這樣的設定應該是為了提高網頁端大量查詢的效率
而 A-DB 屬於內部作業使用有需要極高的正確性,因此屬於page lock等級,
Read isolation 屬 commit,因此 App-Base 開發時只要使用到 insert/update
一律要 commit/rollback才能繼續。

以上設定應該是因應公司營業型態調整的

所以,如果在不知道細節的情況下, Coldfusion 的 <cfquery> 指令下完之後
,無論是Select / Insert / Update 都記得要下一行:
<cftransaction action="commit" />
或是
<cftransaction action="rollback" />
才不至於出現過度lock狀況,當然這也是比較正統的撰寫習慣
至於 sybase driver connector 與 jdbc driver connector為什麼有不一樣的行為,
應該是差在 select 這個指令,sybase driver 對 select 指令會自動 commit 掉,
但是jdbc driver connector 則是全部自己來(該下的指令就要下不要偷懶)。

即便,不是sybase資料庫也建議SQL語句之後最好commit掉,以免有lock過度的情況

0 個回應: