1. 程式人生 > >Hibernate和jdbc事務原理

Hibernate和jdbc事務原理

菜鳥就是菜鳥,不遇到問題還發現不了自己錯在哪了...........

昨天遇到問題,(使用的springMVC和Hibernate,事務是配置的資料來源 匹配方法名來加事務的),在幾個service的方法之間巢狀使用時,發現修改資料資料庫沒變,我以為是幾個service相互巢狀 事務加在了最外層 內層的不用加了就,只需要內層的向上丟擲異常便可。到最後發現內層的方法中修改新增的地方修改不了。 仔細查詢發現內層的service方法名 不是按照匹配的格式寫的(save/del....)之類的,然後我手動加上@Transactional 事務標籤,竟然好了.....
之前一直以為 加事務是為了出錯時候事務回滾,沒發現hibernate的事務不僅僅是回滾,還要事務的提交 !!並且在專案中一般是隻有一層事務的,就是指的你程式的那一層控制。仔細搜了下原來如此:



在Hibernate中, Session開啟的時候,就會自動conn.setAutoCommit(false),不像一般的JDBC,預設都是true,所以你最後不寫 commit也沒有關係,由於Hibernate已經把AutoCommit給關掉了,所以用Hibernate的時候,你在程式中不寫Transaction的話,資料庫根本就沒有反應。
conn.setAutoCommit(false) 這個方法中的引數如下:

true:sql命令的提交(commit)由驅動程式負責false:sql命令的提交由應用程式負責,程式必須呼叫commit或者rollback方法