今天先將最近遇到第二次交易無法完成的現象寫下,後續再把完整的交易控制觀念補上。
這次是遇到三個系統界接所造成的lock情境:
(使用spring的交易控制)
A=>C=>B
A 系統為觸發的主角、B和C為A系統某個交易控制中各自的一個作業或服務(service)
此交易為A開始後,先呼叫C系統的一個作業,由於C系統的commit動作一律不處理,也就是須由呼叫者A決定是否成立,而B作業是在A呼叫C後的同一個交易控制中的一個作業,這就是說明B和C是綁定在同一個交易控制中,但因為C會因需要更新某個table的資料導致該筆資料是被lock情況(須等解lock )而B作業也會去看該筆資料,造成B需等待C解lock 後才可取到值,可是這是在同一個交易管理中,A因為要等到B完成後才可以commit (解開C的lock)又遲遲等不到,導致畫面就卡住直到A的連線timeout發生錯誤後發生rollback才結束。
等待循環: C等A下commit,B等C解lock,A又等B回應。三方互等就是挨餓狀況!
這種案例是因為三個系統都是不同單位的人負責,大家都不知道彼此做了哪些事,最後要不斷嘗試找到問題點,最終雖將B抽離開本交易流程即可解決,但大公司的系統往往就是會遇到這種罕見的案例。若是很單純ABC都由同一單位的人開發應該就會很清楚這種同一table中資料有修改到就是會發生這種lock。當然也可以怪開發的人隨便把B決定放在此交易中,不過大家也知道這種事難免因為新人或不注意會被引起,解問題就是一門學問和經驗了 !
2019年6月1日 星期六
2019年4月17日 星期三
Annotation for transaction management on Spring
使用annotation的優點是明確表示這個方法的交易管理,立即與開發者做出約束
在交易的方法內要盡快地完成,不要穿插一些RPC或HTTP等請求以避免延誤到結束時間,
並非每個方法都要宣告交易,如果只有一個修改指令或只有讀取的指令就不需要使用到交易控制。
在交易的方法內要盡快地完成,不要穿插一些RPC或HTTP等請求以避免延誤到結束時間,
並非每個方法都要宣告交易,如果只有一個修改指令或只有讀取的指令就不需要使用到交易控制。
2012年6月15日 星期五
在Spring使用JSON遇到null的處理
當物件的屬性是null時預設是會顯示null,如下
{"status":"1","singers":["Jolin","Jolinnnnn"],"songs":null}
但如果想要連songs屬性都不要顯示,希望如下
{"status":"1","singers":["Jolin","Jolinnnnn"]}
就必須在該物件多個Annotation去定義這個行為產生的做法
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class YourJSONobj {...
private String status;
private List songs;
private List singers;
...
{"status":"1","singers":["Jolin","Jolinnnnn"],"songs":null}
但如果想要連songs屬性都不要顯示,希望如下
{"status":"1","singers":["Jolin","Jolinnnnn"]}
就必須在該物件多個Annotation去定義這個行為產生的做法
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class YourJSONobj {...
private String status;
private List
private List
...
2010年4月11日 星期日
TransactionException in Hibernate and MySQL
在過一段時間後會出現如上錯誤訊息,這是因為MySQL已經切斷閒置的連線,所以可以利用connection pool的配置來處理這個問題。Mysql服務器預設的「wait_timeout」是8小時(待查證),所以mysql配置中my.ini 的wait_timeout值一定要大於等於connection pool的idle_timeout 值,否則mysql會在wait_timeout的時間後關閉連接,然而連接池還認為該連接可用,這樣就會產生以上圖內的錯誤。
MySQL :
interactive_timeout=XX
The number of seconds the server waits for activity on an interactive connection before closing it.
wait_timeout=XX
The number of seconds the server waits for activity on a noninteractive connection before closing it.
DBCP
timeBetweenEvictionRunsMillis 每毫秒檢查一次連接池中閒置的連接(spec :The number of milliseconds to sleep between runs of the idle object evictor thread. When non-positive, no idle object evictor thread will be run.)預設是-1
minEvictableIdleTimeMillis 連接池中連接可閒置的時間(spec:The minimum amount of time an object may sit idle in the pool before it is eligable for eviction by the idle object evictor (if any). )
上面兩個設定要一起使用,意思是說每timeBetweenEvictionRunsMillis毫秒檢查一次連接池中空閒的連接,把空閒時間超過 minEvictableIdleTimeMillis毫秒的連接斷開,直到連接池中的連接數到minIdle為止
訂閱:
文章 (Atom)
AI 時代的影響(2026-10-24的心得)
寫了半個世紀程式、 曾出版《Clean Code》教全世界工程師把程式碼寫乾淨的 Robert C. Martin(Uncle Bob), 最近公開表示他已經有超過 95% 的時間不再逐行閱讀 AI 寫的程式碼。 一位一生都在強調「程式碼是寫給人讀的」宗師級人物,何以敢做出...
-
這次專案是對既有的DB資料來開發系統,用到 Mybatis的 generator 和 dynamic sql 產生mapper及sql語法(不用寫任何的xml及欄位對應) 其中selectByExample 是對所有欄位都取出,但條件是依照web UI所輸入的欄位動態產生whe...
-
Env. restriction : request and response are both JSON format . Version of Jmeter is higher and equal to 2.6 1. Add new test plan 2. ...
-
因為使用alpine的base image,要讓OS的時區改成自己設定就需要額外安裝tzdata套件,再加上公司環境根本不能連外進行安裝,所以想在docker file設定 ENV TZ=“Asia/Taipei” 或mount volumn使用host的時區 /etc/tim...