package com.taobao.tddl.group;
import static org.junit.Assert.assertEquals;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.StatementCallback;
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.diamond.mockserver.MockServer;
import com.taobao.tddl.group.jdbc.TGroupDataSource;
public class TransactionTest extends BaseGroupTest {
@Test
public void test单库事务() {
TGroupDataSource ds = new TGroupDataSource(GROUP0, APPNAME);
// 强制连dskey0库,读权重为20
MockServer.setConfigInfo(ds.getFullDbGroupKey(), DSKEY0 + ":r20w" + "," + DSKEY1 + ":r");
ds.init();
// 构建spring 事务莫把呢
final TransactionTemplate transactionTemplate = new TransactionTemplate();
transactionTemplate.setTransactionManager(new DataSourceTransactionManager(ds));
final JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
try {
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
assertEquals(1,
jdbcTemplate.update("insert into tddl_test_0000(id,name,gmt_create,gmt_modified) values(10,'str',now(),now())"));
assertEquals(1, jdbcTemplate.update("update tddl_test_0000 set name='str2'"));
jdbcTemplate.execute(new StatementCallback() {
public Object doInStatement(Statement stmt) throws SQLException, DataAccessException {
ResultSet rs = stmt.executeQuery("select id,name from tddl_test_0000");
try {
assertEquals(true, rs.next());
assertEquals(10, rs.getInt(1));
assertEquals("str2", rs.getString(2));
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
}
return null;
}
});
throw new RuntimeException("rollback");
// return null;
}
});
} catch (RuntimeException e) {
// 检查一下数据库记录
}
jdbcTemplate.execute(new StatementCallback() {
public Object doInStatement(Statement stmt) throws SQLException, DataAccessException {
ResultSet rs = stmt.executeQuery("select id,name from tddl_test_0000");
try {
assertEquals(false, rs.next());
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
}
return null;
}
});
}
}