锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Hibernate鍙互閰嶇疆涓?/SPAN>JDBCTransaction鎴栬呮槸JTATransaction錛岃繖鍙栧喅浜庝綘鍦?/SPAN>hibernate.properties涓殑閰嶇疆:
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory
濡傛灉浣犱粈涔堥兘涓嶉厤緗紝榛樿鎯呭喌涓嬩嬌鐢?/SPAN>JDBCTransaction錛屽鏋滀綘閰嶇疆涓猴細
hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
灝嗕嬌鐢?/SPAN>JTATransaction涓嶇浣犲噯澶囪Hibernate浣跨敤JDBCTransaction錛岃繕鏄?/SPAN>JTATransaction錛屾垜鐨勫繝鍛婂氨鏄粈涔堥兘涓嶉厤錛屽皢璁╁畠淇濇寔榛樿鐘舵侊紝濡備笅錛?/SPAN>
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory
鍦ㄤ笅闈㈢殑鍒嗘瀽涓垜浼氱粰鍑哄師鍥犮?/SPAN>
涓銆?/SPAN>JDBC Transaction
鐪嬬湅浣跨敤JDBC Transaction鐨勬椂鍊欐垜浠殑浠g爜渚嬪瓙錛?/SPAN>
Session session = sf.openSession();
Transaction tx = session.beginTransactioin();
...
session.flush();
tx.commit();
session.close();
榪欐槸榛樿鐨勬儏鍐碉紝褰撲綘鍦ㄤ唬鐮佷腑浣跨敤Hibernate鐨?/SPAN>Transaction鐨勬椂鍊欏疄闄呬笂灝辨槸JDBCTransaction銆傞偅涔?/SPAN>JDBCTransaction絀剁珶鏄粈涔堜笢瑗垮憿錛熸潵鐪嬬湅婧愪唬鐮佸氨娓呮浜嗭細
Hibernate2.0.3婧愪唬鐮佷腑鐨勭被
net.sf.hibernate.transaction.JDBCTransaction:
public void begin() throws HibernateException {
...
if (toggleAutoCommit) session.connection().setAutoCommit(false);
...
}
榪欐槸鍚姩Transaction鐨勬柟娉曪紝鐪嬪埌connection().setAutoCommit(false) 浜嗗悧錛熸槸涓嶆槸寰堢啛鎮夛紵 鍐嶆潵鐪?/SPAN>
public void commit() throws HibernateException {
...
try {
if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
try {
session.connection().commit();
committed = true;
}
...
toggleAutoCommit();
}
榪欐槸鎻愪氦鏂規硶錛岀湅鍒?/SPAN>connection().commit() 浜嗗悧錛熶笅闈㈠氨涓嶇敤鎴戝璇翠簡錛岃繖涓被浠g爜闈炲父綆鍗曟槗鎳傦紝閫氳繃闃呰浣挎垜浠槑鐧?/SPAN>Hibernate鐨?/SPAN>Transaction閮藉湪騫蹭簡浜涗粈涔堬紵鎴戠幇鍦ㄦ妸鐢?/SPAN>Hibernate鍐欑殑渚嬪瓙緲昏瘧鎴?/SPAN>JDBC錛屽ぇ瀹跺氨涓鐩簡鐒朵簡錛?/SPAN>
Connection conn = ...; <--- session = sf.openSession();
conn.setAutoCommit(false); <--- tx = session.beginTransactioin();
... <--- ...
conn.commit(); <--- tx.commit(); (瀵瑰簲宸﹁竟鐨勪袱鍙?/SPAN>)
conn.setAutoCommit(true);
conn.close(); <--- session.close();
鐪嬫槑鐧戒簡鍚э紝Hibernate鐨?/SPAN>JDBCTransaction鏍規湰灝辨槸conn.commit鑰屽凡錛屾牴鏈鏃犵縐樺彲璦錛屽彧涓嶈繃鍦?/SPAN>Hibernate涓紝Session鎵撳紑鐨勬椂鍊欙紝灝變細鑷姩conn.setAutoCommit(false)錛屼笉鍍忎竴鑸殑JDBC錛岄粯璁ら兘鏄?/SPAN>true錛屾墍浠ヤ綘鏈鍚庝笉鍐?/SPAN>commit涔熸病鏈夊叧緋伙紝鐢變簬Hibernate宸茬粡鎶?/SPAN>AutoCommit緇欏叧鎺変簡錛屾墍浠ョ敤Hibernate鐨勬椂鍊欙紝浣犲湪紼嬪簭涓笉鍐?/SPAN>Transaction鐨勮瘽錛屾暟鎹簱鏍規湰灝辨病鏈夊弽搴斻?/SPAN>
浜屻?/SPAN>JTATransaction
濡傛灉浣犲湪EJB涓嬌鐢?/SPAN>Hibernate錛屾垨鑰呭噯澶囩敤JTA鏉ョ鐞嗚法Session鐨勯暱浜嬪姟錛岄偅涔堝氨闇瑕佷嬌鐢?/SPAN>JTATransaction錛屽厛鐪嬩竴涓緥瀛愶細
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
...
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
tx.commit();
榪欐槸鏍囧噯鐨勪嬌鐢?/SPAN>JTA鐨勪唬鐮佺墖鏂紝Transaction鏄法Session鐨勶紝瀹冪殑鐢熷懡鍛ㄦ湡姣?/SPAN>Session瑕侀暱銆傚鏋滀綘鍦?/SPAN>EJB涓嬌鐢?/SPAN>Hibernate錛岄偅涔堟槸鏈綆鍗曚笉榪囩殑浜嗭紝浣犱粈涔?/SPAN>Transaction浠g爜緇熺粺閮戒笉瑕佸啓浜嗭紝鐩存帴鍦?/SPAN>EJB鐨勯儴緗叉弿榪扮涓婇厤緗煇鏌愭柟娉曟槸鍚︿嬌鐢ㄤ簨鍔″氨鍙互浜嗐?/SPAN>
鐜板湪鎴戜滑鏉ュ垎鏋愪竴涓?/SPAN>JTATransaction鐨勬簮浠g爜
net.sf.hibernate.transaction.JTATransaction:
public void begin(InitialContext context, ...
...
ut = (UserTransaction) context.lookup(utName);
...
鐪嬫竻妤氫簡鍚楋紵 鍜屾垜涓婇潰鍐欑殑浠g爜 tx = new Initial
Context?().lookup("javax.transaction.UserTransaction");
鏄笉鏄畬鍏ㄤ竴鏍鳳紵
public void commit() ...
...
if (newTransaction) ut.commit();
...
JTATransaction鐨勬帶鍒剁◢寰鏉傦紝涓嶈繃浠嶇劧鍙互寰堟竻妤氱殑鐪嬪嚭鏉?/SPAN>Hibernate鏄浣曞皝瑁?/SPAN>JTA鐨?/SPAN>Transaction浠g爜鐨勩?/SPAN>
浣嗘槸浣犵幇鍦ㄦ槸鍚︾湅鍒頒簡浠涔堥棶棰橈紵 浠旂粏鎯充竴涓嬶紝Hibernate Transaction鏄粠Session涓幏寰楃殑錛?/SPAN>tx = session.beginTransaction()錛屾渶鍚庤鍏堟彁浜?/SPAN>tx錛岀劧鍚庡啀session.close錛岃繖瀹屽叏絎﹀悎JDBC鐨?/SPAN>Transaction鐨勬搷浣滈『搴忥紝浣嗘槸榪欎釜欏哄簭鏄拰JTA鐨?/SPAN>Transactioin鎿嶄綔欏哄簭褰誨簳鐭涚浘鐨勶紒錛侊紒
JTA鏄厛鍚姩Transaction錛岀劧鍚庡惎鍔?/SPAN>Session錛屽叧闂?/SPAN>Session錛屾渶鍚庢彁浜?/SPAN>Transaction錛屽洜姝ゅ綋浣犱嬌鐢?/SPAN>JTA鐨?/SPAN>Transaction鐨勬椂鍊欙紝閭d箞灝卞崈涓囦笉瑕佷嬌鐢?/SPAN>Hibernate鐨?/SPAN>Transaction錛岃屾槸搴旇鍍忔垜涓婇潰鐨?/SPAN>JTA鐨勪唬鐮佺墖鏂偅鏍蜂嬌鐢ㄦ墠琛屻?/SPAN>
鎬葷粨錛?/SPAN>
1銆佸湪JDBC涓婁嬌鐢?/SPAN>Hibernate 蹇呴』鍐欎笂Hibernate Transaction浠g爜錛屽惁鍒欐暟鎹簱娌℃湁鍙嶅簲銆傛鏃?/SPAN>Hibernate鐨?/SPAN>Transaction灝辨槸Connection.commit鑰屽凡
2銆佸湪JTA涓婁嬌鐢?/SPAN>Hibernate 鍐?/SPAN>JTA鐨?/SPAN>Transaction浠g爜錛屼笉瑕佸啓Hibernate鐨?/SPAN>Transaction浠g爜錛屽惁鍒欑▼搴忎細鎶ラ敊
3銆佸湪EJB涓婁嬌鐢?/SPAN>Hibernate 浠涔?/SPAN>Transactioin浠g爜閮戒笉瑕佸啓錛屽湪EJB鐨勯儴緗叉弿榪扮閲岄潰閰嶇疆
|---CMT(Container Managed Transaction)
|
|---BMT(Bean Managed Transaction)
|
|----JDBC Transaction
|
|----JTA Transaction
鎻愰棶錛?/SPAN>
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
...
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
tx.commit();
s1涓嶅叧闂紝浣跨敤s2榪涜鎿嶄綔鐨勪唬鐮佷腑浣跨敤s1鍙笉鍙互錛堟垜瑙夊緱榪欐牱鏇村姞鑺傜害璧勬簮錛屼笉闇瑕佸弽澶嶇殑榪炴帴銆佸叧闂級浣?/SPAN>sf.opengSession()鏃訛紝騫舵病鏈?/SPAN>setAutoCommit(false)錛屾垜鎯抽棶鐨勬槸錛屽鏋滀笉緙栧啓浠諱綍浜嬪姟浠g爜錛屽錛?/SPAN>
Session s = sf.openSession();
......
s.close();
鏁版嵁搴撲細涓嶄細鏈夊弽搴旓紙姝ゆ椂搴旇鏄粯璁?/SPAN>AutoCommit涓?/SPAN>true錛夈?/SPAN>
涓嶄細鏈夊弽搴斻傚湪sf.openSession()
鍒涘緩Session瀹炰緥鐨勬椂鍊欙紝灝卞凡緇忚皟鐢ㄤ簡conn.setAutoCommit(false)浜嗐?/SPAN>
鍙﹀錛屾垜鎯抽棶涓涓嬶細
<code>
1. s.flush()鏄笉鏄繀欏葷殑
2. s.close()鏄笉鏄竴瀹氳鍏抽棴
</code>
鍥炵瓟錛?/SPAN>
s.flush涓嶆槸蹇呴』鐨勶紝s.close()浼氳皟鐢ㄤ竴嬈?/SPAN>s.flush()
s.close()姝e父鎯呭喌涓嬪簲璇ュ叧闂紝闄ら潪浣犳槸鐢?/SPAN>ThreadLocal綆$悊Session銆?/SPAN>
s1涓嶅叧闂紝浣跨敤s2榪涜鎿嶄綔鐨勪唬鐮佷腑浣跨敤s1鍙笉鍙互錛堟垜瑙夊緱榪欐牱鏇村姞鑺傜害璧勬簮錛屼笉闇瑕佸弽澶嶇殑榪炴帴銆佸叧闂級</code>
鍦ㄨ繖涓緥瀛愪腑鐪嬩笉鍑烘潵JTA鐨勪綔鐢ㄣ?/SPAN>
鍋囪
<code>Class A {
find() {
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
}
}</code>
<code>Class B {
find() {
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
}
}
Main {
tx = ...;
A.find();
B.find();
tx.commit();
}
鐪嬫槑鐧戒簡鍚楋紵JTA鐨?/SPAN>Transaction綆$悊鏄法綾昏皟鐢ㄧ殑銆?/SPAN>
1. 鍦╩ySQL涓緩绔嬩竴寮燯SER琛ㄣ?/P>
CREATE TABLE USER (
user_id CHAR(32) NOT NULL PRIMARY KEY,
name VARCHAR(16) NOT NULL,
sex CHAR(1),
age INT
);
2. 寤虹珛涓涓猵ojo
package com.xy;
public class User {
private String id;
private String name;
private char sex;
private int age;
public int getAge() {
return age;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public char getSex() {
return sex;
}
public void setAge(int i) {
age = i;
}
public void setId(String string) {
id = string;
}
public void setName(String string) {
name = string;
}
public void setSex(char c) {
sex = c;
}
}
3. hibernate.cfg.xml鏂囦歡
<?xml version='1.0' encoding='utf-8'?> <hibernate-configuration> <session-factory> <!-- 鏄劇ず瀹為檯鎿嶄綔鏁版嵁搴撴椂鐨凷QL --> <!-- 鏄犲皠鏂囦歡 --> </session-factory> </hibernate-configuration> 4. User.hbm.xml
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"
<property name="show_sql">true</property>
<!-- SQL鏂硅█錛岃繖閲岃瀹氱殑鏄疢ySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- JDBC椹卞姩紼嬪紡 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/jiejie</property>
<!-- 鐢ㄦ埛鍚?-->
<property name="connection.username">root</property>
<!-- 瀵嗙爜-->
<property name="connection.password"></property>
<mapping resource="User.hbm.xml"/>