記一次讓人的噴血的排錯經歷

2022-08-14 21:12:18 字數 1502 閱讀 7807

還原場景:

資料庫某個字段設定的長度是nvchar(10),可當時並不知曉啊......結果導致下單介面返回「將截斷字串或二進位制資料」,查了半天(下單引數實在太多)最終追蹤到某個字段長度不夠導致..... 

因為內部有異常捕獲,所以呼叫方拿到了錯誤訊息!但更詭異的是:竟然生成了訂單資料,只不過字段不夠的那張表失敗了......

模擬**:

try

;t_users user = new t_users()

;db.t_classes.insertonsubmit(cs);

db.t_users.insertonsubmit(user);

db.submitchanges();}}

catch (exception ex)

linq to sql 一次submitchange怎麼沒有rollback呢?也很久不用這個玩意了,我印象中一次submitchange就是獨立的乙個事務單元,可這是怎麼回事?百思不得其解,搞得我都有點懷疑人生......

於是開始使用sql server profiler追蹤submitchange之後最終執行的sql如下:

看了之後又是顛覆了我的三觀,為什麼沒有transcation,難道真的是我記錯了......

嘗試把第二個物件某個屬性賦值超過資料庫字段長度,看第乙個是否可以正常插入還是一起回滾:

try

;t_users user = new t_users()

;db.t_classes.insertonsubmit(cs);

db.t_users.insertonsubmit(user);

db.submitchanges();}}

catch (exception ex)

經過以上驗證,雖然沒有直**到事務,不過從最終的結果看確實是有事務的!但為什麼出現下單「將截斷字串或二進位制資料」?開始檢查**的前後呼叫流程,最終在發現乙個雷:在父類中開啟了乙個分布式事務,還原整個**情形意思如下:

using (transactionscope tran = new transactionscope())

;t_users user = new t_users()

;db.t_classes.insertonsubmit(cs);

db.t_users.insertonsubmit(user);

db.submitchanges();}}

catch (exception ex)

tran.complete();

}

其原因顯而易見了,submitchanges沒有提交成功,transactionscope中complete提交了!

關於transactionscope

記一次tomcat部署排錯經歷(jar衝突)

18 feb 2022 08 32 46.836 severe localhost startstop 1 org.apache.catalina.core.standardcontext.startinternal context ospflowcenter startup failed due ...

一次使用OCI的排錯經歷

使用vs c 2005 sp1 和oracle 10g的oci庫開發乙個應用程式。其中在連線資料庫伺服器呼叫ocienvcreate函式返回 1,開始百思不得其解,本想通過ocierrorget 函式獲取相關錯誤資訊。但聽公司一位高手說,ocienvcreate函式呼叫失敗,是無法使用ocierro...

記一次DHCP排錯

如拓撲,某業務整個網路劃分在乙個vlan之下,入網的終端裝置要接收來自dhcp伺服器的ip指派,業務正常,客戶開心,一切都顯得祥和安靜 忽然有一天,使用者的乙個動作打破了一切。他把終端的網線無情的插入到了路由的lan口,如此,路由器本身的dhcp發揮作用,混進了這個vlan。自此,這個vlan下廣播...