package com.taobao.tddl.qatest.matrix.transaction; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized.Parameters; import com.taobao.tddl.qatest.BaseMatrixTestCase; import com.taobao.tddl.qatest.BaseTestCase; import com.taobao.tddl.qatest.ExecuteTableName; import com.taobao.tddl.qatest.util.EclipseParameterized; @RunWith(EclipseParameterized.class) public class TransactionMultiTableTest extends BaseMatrixTestCase { @Parameters(name = "{index}:table0={0},table1={1}") public static List<String[]> prepare() { return Arrays.asList(ExecuteTableName.normaltblStudentTable(dbType)); } public TransactionMultiTableTest(String normaltblTableName, String studentTableName){ BaseTestCase.normaltblTableName = normaltblTableName; BaseTestCase.studentTableName = studentTableName; } @Before public void initData() throws Exception { con = getConnection(); andorCon = us.getConnection(); andorUpdateData("DELETE FROM " + studentTableName, null); mysqlUpdateData("DELETE FROM " + studentTableName, null); andorUpdateData("DELETE FROM " + normaltblTableName, null); mysqlUpdateData("DELETE FROM " + normaltblTableName, null); } @After public void destory() throws Exception { psConRcRsClose(rc, rs); } @Test public void testCommit() throws Exception { if (!normaltblTableName.substring(0, 2).equals(studentTableName.substring(0, 2))) { // 跨库事务暂不支持 return; } String sql = "insert into " + normaltblTableName + "(pk,id) values(" + RANDOM_ID + "," + RANDOM_INT + ")"; andorCon = us.getConnection(); andorCon.setAutoCommit(false); con = getConnection(); con.setAutoCommit(false); try { int mysqlAffectRow = mysqlUpdateDataTranscation(sql, null); int andorAffectRow = andorUpdateDataTranscation(sql, null); Assert.assertEquals(mysqlAffectRow, andorAffectRow); sql = "insert into " + studentTableName + " (id,name,school) values (?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(name); param.add(school); mysqlAffectRow = mysqlUpdateDataTranscation(sql, param); andorAffectRow = andorUpdateDataTranscation(sql, param); Assert.assertEquals(mysqlAffectRow, andorAffectRow); con.commit(); andorCon.commit(); } catch (Exception e) { try { con.rollback(); andorCon.rollback(); } catch (Exception ee) { } } sql = "select * from " + normaltblTableName + " where pk=" + RANDOM_ID; String[] columnParam1 = { "ID" }; selectOrderAssertTranscation(sql, columnParam1, null); sql = "select * from " + studentTableName + " where id=" + RANDOM_ID; String[] columnParam = { "NAME", "SCHOOL" }; selectOrderAssertTranscation(sql, columnParam, null); } @Test public void testRollback() throws Exception { if (!normaltblTableName.substring(0, 2).equals(studentTableName.substring(0, 2))) { // 跨库事务暂不支持 return; } String sql = "insert into " + normaltblTableName + "(pk,id) values(" + RANDOM_ID + "," + RANDOM_INT + ")"; andorCon = us.getConnection(); andorCon.setAutoCommit(false); con = getConnection(); con.setAutoCommit(false); try { int mysqlAffectRow = mysqlUpdateDataTranscation(sql, null); int andorAffectRow = andorUpdateDataTranscation(sql, null); Assert.assertEquals(mysqlAffectRow, andorAffectRow); sql = "insert into " + studentTableName + " (id,name,school) values (?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(name); param.add(school); mysqlAffectRow = mysqlUpdateDataTranscation(sql, param); andorAffectRow = andorUpdateDataTranscation(sql, param); Assert.assertEquals(mysqlAffectRow, andorAffectRow); con.rollback(); andorCon.rollback(); } catch (Exception e) { try { con.rollback(); andorCon.rollback(); } catch (Exception ee) { } } sql = "select * from " + normaltblTableName + " where pk=" + RANDOM_ID; String[] columnParam1 = { "ID" }; selectOrderAssertTranscation(sql, columnParam1, null); sql = "select * from " + studentTableName + " where id=" + RANDOM_ID; String[] columnParam = { "NAME", "SCHOOL" }; selectOrderAssertTranscation(sql, columnParam, null); } @Test public void testBeforeRollback() throws Exception { if (!normaltblTableName.substring(0, 2).equals(studentTableName.substring(0, 2))) { // 跨库事务暂不支持 return; } String sql = "insert into " + normaltblTableName + "(pk,id) values(" + RANDOM_ID + "," + RANDOM_INT + ")"; andorCon = us.getConnection(); andorCon.setAutoCommit(false); String[] columnParam1 = { "ID" }; String[] columnParam = { "NAME", "SCHOOL" }; con = getConnection(); con.setAutoCommit(false); try { int mysqlAffectRow = mysqlUpdateDataTranscation(sql, null); int andorAffectRow = andorUpdateDataTranscation(sql, null); Assert.assertEquals(mysqlAffectRow, andorAffectRow); sql = "insert into " + studentTableName + " (id,name,school) values (?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(name); param.add(school); mysqlAffectRow = mysqlUpdateDataTranscation(sql, param); andorAffectRow = andorUpdateDataTranscation(sql, param); Assert.assertEquals(mysqlAffectRow, andorAffectRow); sql = "select * from " + normaltblTableName + " where pk=" + RANDOM_ID; selectOrderAssertTranscation(sql, columnParam1, null); sql = "select * from " + studentTableName + " where id=" + RANDOM_ID; selectOrderAssertTranscation(sql, columnParam, null); con.rollback(); andorCon.rollback(); } catch (Exception e) { try { con.rollback(); andorCon.rollback(); } catch (Exception ee) { } } sql = "select * from " + normaltblTableName + " where pk=" + RANDOM_ID; selectOrderAssertTranscation(sql, columnParam1, null); sql = "select * from " + studentTableName + " where id=" + RANDOM_ID; selectOrderAssertTranscation(sql, columnParam, null); } }