/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.spi.txsyn; import javax.transaction.RollbackException; import org.frameworkset.spi.BaseSPIManager; import org.frameworkset.spi.SPIException; import com.frameworkset.orm.transaction.TransactionManager; public class TestTXSyn { public static void testTX2ndSyn() { try { AI a = (AI) BaseSPIManager.getProvider("txsyn.a","A1"); try { /** * 两个提供者方法都调用成功,共用相同的事务 */ a.testTXSynSuccess(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * A1事务执行成功,A2同步调用的方法事务执行失败,所以整个事务执行失败 */ a.testTXSynFailed(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 执行事务,不同步调用其他服务方法 */ a.testTXNoSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 同步调用A1和A2的方法,没有事务环境 */ a.testNoTXSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 既没有同步控制,也没有事务控制 */ a.testNoTXNoSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 包含声明式事务的同步方法,并且定义了事务回滚的异常类型为SynException * 但是同步方法抛出异常类型为SynException,所以事务会回滚 */ a.testWithSpecialException(1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // try { /** * 包含声明式事务的同步方法,并且定义了事务回滚的异常类型为SynException * 但是同步方法抛出异常类型为Exception,所以事务不会回滚 */ a.testWithSpecialException(2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (SPIException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void testTX2ndSynWithOuterTX() { TransactionManager tm = new TransactionManager(); try { tm.begin(); AI a = (AI) BaseSPIManager.getProvider("txsyn.a","A1"); try { /** * 两个提供者方法都调用成功,共用相同的事务 */ a.testTXSynSuccess(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * A1事务执行成功,A2同步调用的方法事务执行失败,所以整个事务执行失败 */ a.testTXSynFailed(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 执行事务,不同步调用其他服务方法 */ a.testTXNoSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 同步调用A1和A2的方法,没有事务环境 */ a.testNoTXSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 既没有同步控制,也没有事务控制 */ a.testNoTXNoSyn(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /** * 包含声明式事务的同步方法,并且定义了事务回滚的异常类型为SynException * 但是同步方法抛出异常类型为SynException,所以事务会回滚 */ a.testWithSpecialException(1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // try { /** * 包含声明式事务的同步方法,并且定义了事务回滚的异常类型为SynException * 但是同步方法抛出异常类型为Exception,所以事务不会回滚 */ a.testWithSpecialException(2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } tm.commit(); } catch (SPIException e) { // TODO Auto-generated catch block e.printStackTrace(); try { tm.rollback(); } catch (RollbackException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } catch(Exception e) { e.printStackTrace(); try { tm.rollback(); } catch (RollbackException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } public static void testSingle() { try { AI a = (AI) BaseSPIManager.getProvider("txsyn.a","A1"); AI a1 = (AI) BaseSPIManager.getProvider("txsyn.a","A1"); AI a2 = (AI) BaseSPIManager.getProvider("txsyn.a","A2"); AI a21 = (AI) BaseSPIManager.getProvider("txsyn.a","A2"); System.out.println("a:" + a); System.out.println("a1:" + a1); System.out.println("a2:" + a2); System.out.println("a21:" + a21); } catch (SPIException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { testSingle(); testTX2ndSyn(); // testTX2ndSynWithOuterTX(); } }