使用JOTM實現分散式事務的例子
import java.sql.Connection;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.hsqldb.Server;
import org.objectweb.jotm.Jotm;
import org.springframework.jdbc.core.JdbcTemplate;
public class XADataSourceTest {
public static void main(String[] args) throws Exception {
startDataBase();
//建立J他的UserTransaction和TransactionManager。
//下面會使用UserTransaction進行事務的提交和回滾。
//TransactionManager用來管理事務源。
Jotm jotm = new Jotm(true, false);
TransactionManager transactionManager = jotm.getTransactionManager();
UserTransaction utx = jotm.getUserTransaction();
//建立一個分散式資料來源 XADataSource
StandardXADataSource dataSource1 = new StandardXADataSource();
dataSource1.setDriverName("org.hsqldb.jdbcDriver");
dataSource1.setUser("sa");
dataSource1.setUrl("jdbc:hsqldb:testdb1");
//將該資料來源加入到TransactionManager管理範圍內
dataSource1.setTransactionManager(transactionManager);
StandardXADataSource dataSource2 = new StandardXADataSource();
dataSource2.setDriverName("org.hsqldb.jdbcDriver");
dataSource2.setUser("sa");
dataSource2.setUrl("jdbc:hsqldb:testdb2");
dataSource2.setTransactionManager(transactionManager);
//得到兩個分散式Connection
Connection cn1 = dataSource1.getXAConnection().getConnection();
Connection cn2 = dataSource2.getXAConnection().getConnection();
try{
cn1.createStatement().execute("DROP TABLE table1");
cn2.createStatement().execute("DROP TABLE table2");
}catch(Exception e){}
cn1.createStatement().execute("CREATE TABLE table1(id int primary key, money int)");
cn2.createStatement().execute("CREATE TABLE table2(id int primary key, money int)");
//插入初始資料。
cn1.createStatement().execute("INSERT INTO table1 VALUES(1, 50)");
cn2.createStatement().execute("INSERT INTO table2 VALUES(1, 50)");
utx.begin();
try{
cn1.createStatement().execute("UPDATE table1 SET money=money-10 WHERE id=1");
cn2.createStatement().execute("UPDATE table2 SET money=money+10 WHERE id=1");
//模擬丟擲一個業務異常
int a = 1 / 0;
utx.commit();
}catch(Exception e) {
utx.rollback();
}
System.out.println(new JdbcTemplate(dataSource1).queryForInt("SELECT money FROM table1 WHERE id=1"));
System.out.println(new JdbcTemplate(dataSource2).queryForInt("SELECT money FROM table2 WHERE id=1"));
}
//啟動HSQL,其中有兩個資料庫testdb1和testdb2。
private static void startDataBase() {
Server.main(new String[]{"-database.0", "hsqldb/testdb1", "-dbname.0", "testdb1", "-database.1", "hsqldb/testdb2", "-dbname.1", "testdb2"});
}
}
執行結果為:
50
50
說明事務回滾了。
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.hsqldb.Server;
import org.objectweb.jotm.Jotm;
import org.springframework.jdbc.core.JdbcTemplate;
public class XADataSourceTest {
public static void main(String[] args) throws Exception {
startDataBase();
//建立J他的UserTransaction和TransactionManager。
//下面會使用UserTransaction進行事務的提交和回滾。
//TransactionManager用來管理事務源。
Jotm jotm = new Jotm(true, false);
TransactionManager transactionManager = jotm.getTransactionManager();
UserTransaction utx = jotm.getUserTransaction();
//建立一個分散式資料來源 XADataSource
StandardXADataSource dataSource1 = new StandardXADataSource();
dataSource1.setDriverName("org.hsqldb.jdbcDriver");
dataSource1.setUser("sa");
dataSource1.setUrl("jdbc:hsqldb:testdb1");
//將該資料來源加入到TransactionManager管理範圍內
dataSource1.setTransactionManager(transactionManager);
StandardXADataSource dataSource2 = new StandardXADataSource();
dataSource2.setDriverName("org.hsqldb.jdbcDriver");
dataSource2.setUser("sa");
dataSource2.setUrl("jdbc:hsqldb:testdb2");
dataSource2.setTransactionManager(transactionManager);
//得到兩個分散式Connection
Connection cn1 = dataSource1.getXAConnection().getConnection();
Connection cn2 = dataSource2.getXAConnection().getConnection();
try{
cn1.createStatement().execute("DROP TABLE table1");
cn2.createStatement().execute("DROP TABLE table2");
}catch(Exception e){}
cn1.createStatement().execute("CREATE TABLE table1(id int primary key, money int)");
cn2.createStatement().execute("CREATE TABLE table2(id int primary key, money int)");
//插入初始資料。
cn1.createStatement().execute("INSERT INTO table1 VALUES(1, 50)");
cn2.createStatement().execute("INSERT INTO table2 VALUES(1, 50)");
utx.begin();
try{
cn1.createStatement().execute("UPDATE table1 SET money=money-10 WHERE id=1");
cn2.createStatement().execute("UPDATE table2 SET money=money+10 WHERE id=1");
//模擬丟擲一個業務異常
int a = 1 / 0;
utx.commit();
}catch(Exception e) {
utx.rollback();
}
System.out.println(new JdbcTemplate(dataSource1).queryForInt("SELECT money FROM table1 WHERE id=1"));
System.out.println(new JdbcTemplate(dataSource2).queryForInt("SELECT money FROM table2 WHERE id=1"));
}
//啟動HSQL,其中有兩個資料庫testdb1和testdb2。
private static void startDataBase() {
Server.main(new String[]{"-database.0", "hsqldb/testdb1", "-dbname.0", "testdb1", "-database.1", "hsqldb/testdb2", "-dbname.1", "testdb2"});
}
}
執行結果為:
50
50
說明事務回滾了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742815/viewspace-589259/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用Spring Boot實現分散式事務Spring Boot分散式
- 分散式事務(3)---RocketMQ實現分散式事務原理分散式MQ
- 分散式事務(4)---RocketMQ實現分散式事務專案分散式MQ
- 使用CRDT實現分散式事務的資料推薦分散式
- 分散式事務的幾種實現方式分散式
- 基於RocketMQ實現分散式事務MQ分散式
- SpringCloud+RocketMQ實現分散式事務SpringGCCloudMQ分散式
- Apache ShardingSphere 如何實現分散式事務Apache分散式
- 分散式事務(一)—分散式事務的概念分散式
- node.js 中使用redis實現分散式事務鎖Node.jsRedis分散式
- 資料庫分散式事務的實現原理!資料庫分散式
- 分散式事務實戰分散式
- 分散式事務之資料庫事務與JDBC事務實現(一)分散式資料庫JDBC
- AspNetCore&MassTransit Courier實現分散式事務NetCore分散式
- Golang 實現 Redis(8): TCC分散式事務GolangRedis分散式
- php基於dtm分散式事務管理器實現tcc模式分散式事務demoPHP分散式模式
- MySQL 中基於 XA 實現的分散式事務MySql分散式
- Seata 無侵入式分散式事務服務的實現基石-JDBC篇分散式JDBC
- 使用Spring Boot + Kafka實現Saga分散式事務模式的原始碼 - vinsguruSpring BootKafka分散式模式原始碼
- 分散式事務之JTA原理與實現(三)分散式
- kratos分散式事務實踐分散式
- 分散式事務 | 使用DTM 的Saga 模式分散式模式
- 分散式事務之事務實現模式與技術(四)分散式模式
- 基於Seata探尋分散式事務的實現方案分散式
- 事務使用中如何避免誤用分散式事務分散式
- 搞懂分散式技術19:使用RocketMQ事務訊息解決分散式事務分散式MQ
- Dubbo 分散式事務一致性實現分散式
- Laravel基於reset機制實現分散式事務Laravel分散式
- Asp.Net Core&CAP實現分散式事務ASP.NET分散式
- MassTransit | 基於StateMachine實現Saga編排式分散式事務Mac分散式
- 微服務架構 | 11.1 整合 Seata AT 模式實現分散式事務微服務架構模式分散式
- MySQL資料庫分散式事務XA的實現原理分析MySql資料庫分散式
- 分散式事務與Seate框架(3)——Seata的AT模式實現原理分散式框架模式
- 分散式事務和分散式hash分散式
- go-zero微服務實戰系列(十、分散式事務如何實現)Go微服務分散式
- 各種分散式事務的實現方式適用的場景分散式
- 實戰與原理:如何基於RocketMQ實現分散式事務?MQ分散式
- 分散式訊息佇列RocketMQ--事務訊息--解決分散式事務的最佳實踐分散式佇列MQ
- Spring Cloud Seata系列:基於AT模式實現分散式事務SpringCloud模式分散式