package com.taobao.tddl.qatest.group.selector; import java.util.Map; import org.junit.Assert; import org.junit.Test; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import com.taobao.tddl.common.GroupDataSourceRouteHelper; import com.taobao.tddl.qatest.group.GroupTestCase; /** * Comment for queryFromSlaveInTransactionTest * <p/> * Created Date: 2010-12-8 下午08:37:41 */ @SuppressWarnings("rawtypes") public class QueryFromSlaveInTransactionTest extends GroupTestCase { @Test public void querySlaveInTransactionTest() throws Exception { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(tds); TransactionTemplate transTemp = new TransactionTemplate(); transTemp.setTransactionManager(transactionManager); // 插入不同的数据到2个库 String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; Object[] arguments = new Object[] { RANDOM_ID, nextDay }; tddlJT.update(sql, arguments); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1); String sql2 = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; tddlJT.update(sql2, new Object[] { RANDOM_ID, time }); transTemp.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try { // 事务中未指定数据库进行读写操作,必走写库 for (int i = 0; i < 10; i++) { Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(nextDay, String.valueOf(re.get("gmt_create"))); } } catch (DataAccessException e) { status.setRollbackOnly(); Assert.fail(e.getMessage()); } return null; } }); transTemp.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try { // 事务中指定数据库进行读写操作,那么事务中进行读写必走写库的限制就没有了 GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(2); String sql3 = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; Object[] arguments3 = new Object[] { RANDOM_ID, time }; tddlJT.update(sql3, arguments3); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(2); Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); } catch (DataAccessException e) { status.setRollbackOnly(); Assert.fail(e.getMessage()); } return null; } }); } }