Java事務(八),java事務
一. 前言:
上一篇部落格中,我們使用jotm實現了分散式交易, 本篇將使用atomikos實現。
基本的代碼都是一樣的,就是配置略有不同。
二. 代碼實現:
1. 代碼結構圖:
2. 設定檔:ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 資料庫1 --><bean id="db1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>mysql/main</value> </property> <property name="xaDataSourceClassName"> <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1</value> </property> </bean> <!-- 資料庫2 --> <bean id="db2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>mysql/secondary</value> </property> <property name="xaDataSourceClassName"> <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=utf-8;user=root;password=root</value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1</value> </property> </bean> <bean id="userTransactionManager" init-method="init" destroy-method="close" class="com.atomikos.icatch.jta.UserTransactionManager"> <property name="forceShutdown" value="true" /> </bean> <bean id="userTransactionImp" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300"/> </bean> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="userTransactionManager" /> <property name="userTransaction" ref="userTransactionImp" /> <property name="allowCustomIsolationLevels" value="true"/> </bean> <!-- 配置事務傳播特性 --> <tx:advice id="txAdvice" transaction-manager="jtaTransactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 交易管理 --> <aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(* com.zdp.service..*.*(..))" advice-ref="txAdvice"/> </aop:config> <bean id="userDao" class="com.zdp.dao.UserDao"> <property name="dataSource" ref="db1" /> </bean> <bean id="logDao" class="com.zdp.dao.LogDao"> <property name="dataSource" ref="db2" /> </bean> <bean id="userService" class="com.zdp.service.UserService"> <property name="userDao" ref="userDao" /> <property name="logDao" ref="logDao" /> </bean></beans>
其他的代碼請參見上一篇部落格。
源碼下載: http://download.csdn.net/detail/zdp072/7950391
java事務中有什
給你個連結mianshi.fenzhi.com/post/522.html 裡面介紹的很詳細!!
java 事務
Java中的交易處理
一般情況下,J2EE應用伺服器支援JDBC事務、JTA(Java Transaction API)事務、容器管理事務。一般情況下,最好不要在程式中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在儘可能短的時間內完成,不要在不同方法中實現事務的使用。下面我們列舉兩種交易處理方式。
1、JavaBean中使用JDBC方式進行交易處理
在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,開啟一個連線物件Connection時,預設是auto-commit模式,每個SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。為了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之後,如果不調用commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法調用之後的所有SQL會在方法commit()調用時得到確認。
public int delete(int sID) {
dbc = new DataBaseConnection();
Connection con = dbc.getConnection();
try {
con.setAutoCommit(false);// 更改JDBC事務的預設提交方式
dbc.executeUpdate("delete from bylaw where ID=" + sID);
dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
con.commit();//提交JDBC事務
con.setAutoCommit(true);// 恢複JDBC事務的預設提交方式
dbc.close();
return 1;
}
catch (Exception exc) {
con.rollBack();//復原JDBC事務
exc.printStackTrace();
dbc.close();
return -1;
}
}
2、SessionBean中的JTA事務
JTA 是事務服務的 J2EE 解決方案。本質上,它是描述事務介面(比如 UserTransaction 介面,開發人員直接使用該介面或者通過 J2EE 容器使用該介面來確保商務邏輯能夠可靠地運行)的 J2EE 模型的一部分。JTA 具有的三個主要的介面分別是 UserTransaction 介面、TransactionManager 介面和 Transaction 介面。這些介面共用公用的事務操作,例如 commit() 和 rollback(), 但是也包含特殊的事務操作,例如 suspend(),resume() 和 enlist(),它們只出現在特定的介面上,以便在實現中允許一定程度的存取控制。例如,UserTransaction 能夠執行事務劃分和基本的事務操作,而 TransactionManager 能夠執行內容管理。
應用程式可以調用UserTransaction.begin()方......餘下全文>>