Java事務(七),java事務

來源:互聯網
上載者:User

Java事務(七),java事務

一. 前言:

在寫這篇部落格之前,我們需要弄清楚兩個概念:本地事務和分散式交易。

本地事務:只處理單一資料來源,比如單個資料庫。

分散式交易:處理多種異構的資料來源, 比如某個業務操作中同時包含JDBC和JMS或者某個操作需要訪問多個不同的資料庫。


Java通過JTA完成分散式交易, JTA本身只是一種規範, 本篇部落格將使用JOTM作為實現, 後續還會使用Atomikos實現。


二. 業務背景:

假定我們有這樣一個需求:當我們建立一個使用者的時候需要往一個DB中插入一條使用者記錄,還需要往另一個DB中記錄日誌

因為是不同的DB操作,所以這裡就涉及到分散式交易的處理。


三. 代碼實現:

1. 代碼結構圖:



2. 建表語句:

create database log;DROP TABLE IF EXISTS `log`;CREATE TABLE `log` (  `id` varchar(20) NOT NULL,  `content` varchar(100) default NULL,  PRIMARY KEY  (`id`));create database user;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (  `id` varchar(20) NOT NULL,  `name` varchar(40) default NULL,  PRIMARY KEY  (`id`));

3. 設定檔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"><!-- 引用Spring內部所提供的對JOTM支援的工廠類 --><bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /><!-- 配置JTA交易管理員, 並在管理器中使用上面所配置的JOTM --><bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"><property name="userTransaction" ref="jotm" /></bean><!-- 配置多個資料來源 --><bean id="db1" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"><property name="dataSource"><bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"><property name="transactionManager" ref="jotm" /><property name="driverName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:MySQL://localhost:3306/user" /></bean></property><property name="user" value="root" /><property name="password" value="root" /></bean><bean id="db2" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"><property name="dataSource"><bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"><property name="transactionManager" ref="jotm" /><property name="driverName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:MySQL://localhost:3306/log" /></bean></property><property name="user" value="root" /><property name="password" value="root" /></bean><!-- 根據不同的資料來源配置兩個jdbcTemplate --><bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="db1" /></bean><bean id="jdbcTemplate2" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="db2" /></bean><bean id="userDao" class="com.zdp.dao.UserDao"><property name="jdbcTemplate" ref="jdbcTemplate1" /></bean><bean id="logDao" class="com.zdp.dao.LogDao"><property name="jdbcTemplate" ref="jdbcTemplate2" /></bean><bean id="userService" class="com.zdp.service.UserService"><property name="userDao" ref="userDao" /><property name="logDao" ref="logDao" /></bean><!-- JTA事務傳播特性 -->    <tx:advice id="txAdviceJTA" transaction-manager="txManager">        <tx:attributes>        <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>        <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>            <tx:method name="create*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>            <tx:method name="insert*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>            <tx:method name="del*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>            <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>        <tx:method name="*" read-only="true"/>         </tx:attributes>    </tx:advice>        <aop:config>        <aop:advisor pointcut="execution(* com.zdp.service..*(..))"   advice-ref="txAdviceJTA" />    </aop:config></beans>  

4. service業務類:

public class UserService {private UserDao userDao;private LogDao logDao;public void saveUser(String id, String name) {userDao.insertUser(id, name);// int i = 1 / 0;  // 製造異常logDao.insertLog(id, id + "_" + name);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public LogDao getLogDao() {return logDao;}public void setLogDao(LogDao logDao) {this.logDao = logDao;}}

5. Dao類:

public class UserDao extends JdbcDaoSupport {public void insertUser(String id, String name) {JdbcTemplate template = getJdbcTemplate();template.execute("insert into user values('" + id + "','" + name + "')");}}

public class LogDao extends JdbcDaoSupport {public void insertLog(String id, String content) {JdbcTemplate template = getJdbcTemplate();template.execute("insert into log values('" + id + "','" + content + "')");}}

6. 測試類別:

public class UserTest {@Testpublic void testSave() {ApplicationContext cxt = new ClassPathXmlApplicationContext("ApplicationContext.xml");UserService us = (UserService) cxt.getBean("userService");us.saveUser("1", "zhangsan");}}


源碼下載: http://download.csdn.net/detail/zdp072/7950383



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()方......餘下全文>>
 
java事務中有什

給你個連結mianshi.fenzhi.com/post/522.html 裡面介紹的很詳細!!
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.