use of io.seata.rm.datasource.StatementProxy in project seata by seata.
the class BaseTransactionalExecutorTest method testExecuteWithGlobalLockSet.
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testExecuteWithGlobalLockSet() throws Throwable {
// initial objects
ConnectionProxy connectionProxy = new ConnectionProxy(null, null);
StatementProxy statementProxy = new StatementProxy<>(connectionProxy, null);
BaseTransactionalExecutor<Object, Statement> baseTransactionalExecutor = new BaseTransactionalExecutor<Object, Statement>(statementProxy, null, (SQLRecognizer) null) {
@Override
protected Object doExecute(Object... args) {
return null;
}
};
GlobalLockTemplate template = new GlobalLockTemplate();
// not in global lock context
try {
baseTransactionalExecutor.execute(new Object());
Assertions.assertFalse(connectionProxy.isGlobalLockRequire(), "connection context set!");
} catch (Throwable e) {
throw new RuntimeException(e);
}
// in global lock context
template.execute(new GlobalLockExecutor() {
@Override
public Object execute() throws Throwable {
baseTransactionalExecutor.execute(new Object());
Assertions.assertTrue(connectionProxy.isGlobalLockRequire(), "connection context not set!");
return null;
}
@Override
public GlobalLockConfig getGlobalLockConfig() {
return null;
}
});
}
use of io.seata.rm.datasource.StatementProxy in project seata by seata.
the class MultiExecutorTest method testBeforeImageAndAfterImages.
@Test
public void testBeforeImageAndAfterImages() throws SQLException {
// same table and same type
String sql = "update table_update_executor_test set name = 'WILL' where id = 1;" + "update table_update_executor_test set name = 'WILL2' where id = 2";
List<SQLRecognizer> multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
TableRecords beforeImage = executor.beforeImage();
Map multiSqlGroup = executor.getMultiSqlGroup();
Map beforeImagesMap = executor.getBeforeImagesMap();
Assertions.assertEquals(multiSqlGroup.size(), 1);
Assertions.assertEquals(beforeImagesMap.size(), 1);
TableRecords afterImage = executor.afterImage(beforeImage);
Assertions.assertEquals(executor.getAfterImagesMap().size(), 1);
executor.prepareUndoLog(beforeImage, afterImage);
List<SQLUndoLog> items = connectionProxy.getContext().getUndoItems();
Assertions.assertTrue(items.stream().allMatch(t -> Objects.equals(t.getSqlType(), SQLType.UPDATE) && Objects.equals(t.getTableName(), "table_update_executor_test")));
Assertions.assertEquals(items.size(), 1);
connectionProxy.getContext().reset();
// same table delete
sql = "delete from table_update_executor_test where id = 2;" + "delete from table_update_executor_test where id = 3";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
beforeImage = executor.beforeImage();
multiSqlGroup = executor.getMultiSqlGroup();
beforeImagesMap = executor.getBeforeImagesMap();
Assertions.assertEquals(multiSqlGroup.size(), 1);
Assertions.assertEquals(beforeImagesMap.size(), 1);
afterImage = executor.afterImage(beforeImage);
Assertions.assertEquals(executor.getAfterImagesMap().size(), 1);
executor.prepareUndoLog(beforeImage, afterImage);
items = connectionProxy.getContext().getUndoItems();
Set<String> itemSet = items.stream().map(t -> t.getTableName()).collect(Collectors.toSet());
Assertions.assertTrue(itemSet.contains("table_update_executor_test"));
Assertions.assertEquals(items.size(), 1);
connectionProxy.getContext().reset();
// multi table update
sql = "update table_update_executor_test set name = 'WILL' where id = 1;update table_update_executor_test2 set name = 'WILL' where id = 1;update table_update_executor_test2 set name = 'WILL' where id = 3;";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
beforeImage = executor.beforeImage();
multiSqlGroup = executor.getMultiSqlGroup();
beforeImagesMap = executor.getBeforeImagesMap();
Assertions.assertEquals(multiSqlGroup.size(), 2);
Assertions.assertEquals(beforeImagesMap.size(), 2);
afterImage = executor.afterImage(beforeImage);
Assertions.assertEquals(executor.getAfterImagesMap().size(), 2);
executor.prepareUndoLog(beforeImage, afterImage);
items = connectionProxy.getContext().getUndoItems();
itemSet = items.stream().map(t -> t.getTableName()).collect(Collectors.toSet());
Assertions.assertTrue(itemSet.contains("table_update_executor_test"));
Assertions.assertTrue(itemSet.contains("table_update_executor_test2"));
Assertions.assertEquals(items.size(), 2);
connectionProxy.getContext().reset();
// multi table delete
sql = "delete from table_update_executor_test2 where id = 2;delete from table_update_executor_test where id = 3;delete from table_update_executor_test where id = 4;delete from table_update_executor_test";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
beforeImage = executor.beforeImage();
multiSqlGroup = executor.getMultiSqlGroup();
beforeImagesMap = executor.getBeforeImagesMap();
Assertions.assertEquals(multiSqlGroup.size(), 2);
Assertions.assertEquals(beforeImagesMap.size(), 2);
afterImage = executor.afterImage(beforeImage);
Assertions.assertEquals(executor.getAfterImagesMap().size(), 2);
executor.prepareUndoLog(beforeImage, afterImage);
items = connectionProxy.getContext().getUndoItems();
itemSet = items.stream().map(t -> t.getTableName()).collect(Collectors.toSet());
Assertions.assertTrue(itemSet.contains("table_update_executor_test"));
Assertions.assertTrue(itemSet.contains("table_update_executor_test2"));
Assertions.assertEquals(items.size(), 2);
// contains limit delete
sql = "delete from table_update_executor_test2 where id = 2;delete from table_update_executor_test2 where id = 2 limit 1;";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
Assertions.assertThrows(NotSupportYetException.class, executor::beforeImage);
// contains order by and limit delete
sql = "delete from table_update_executor_test2 where id = 2;delete from table_update_executor_test2 where id = 2 order by id desc limit 1;";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
Assertions.assertThrows(NotSupportYetException.class, executor::beforeImage);
// contains order by update
sql = "update table_update_executor_test set name = 'WILL' where id = 1;update table_update_executor_test set name = 'WILL' where id = 1 order by id desc;";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
Assertions.assertThrows(NotSupportYetException.class, executor::beforeImage);
// contains order by and limit update
sql = "update table_update_executor_test set name = 'WILL' where id = 1;update table_update_executor_test set name = 'WILL' where id = 1 order by id desc limit 1;";
multi = SQLVisitorFactory.get(sql, JdbcConstants.MYSQL);
executor = new MultiExecutor(statementProxy, (statement, args) -> {
return null;
}, multi);
Assertions.assertThrows(NotSupportYetException.class, executor::beforeImage);
}
use of io.seata.rm.datasource.StatementProxy in project seata by seata.
the class MultiExecutorTest method init.
@BeforeAll
public static void init() throws Throwable {
List<String> returnValueColumnLabels = Lists.newArrayList("id", "name");
Object[][] returnValue = new Object[][] { new Object[] { 1, "Tom" }, new Object[] { 2, "Jack" } };
Object[][] columnMetas = new Object[][] { new Object[] { "", "", "table_update_executor_test", "id", Types.INTEGER, "INTEGER", 64, 0, 10, 1, "", "", 0, 0, 64, 1, "NO", "YES" }, new Object[] { "", "", "table_update_executor_test", "name", Types.VARCHAR, "VARCHAR", 64, 0, 10, 0, "", "", 0, 0, 64, 2, "YES", "NO" } };
Object[][] indexMetas = new Object[][] { new Object[] { "PRIMARY", "id", false, "", 3, 1, "A", 34 } };
mockDriver = new MockDriver(returnValueColumnLabels, returnValue, columnMetas, indexMetas);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
field.set(dataSourceProxy, "mysql");
connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
statementProxy = new StatementProxy(connectionProxy, mockStatement);
} catch (Exception e) {
throw new RuntimeException("init failed");
}
}
use of io.seata.rm.datasource.StatementProxy in project seata by seata.
the class SelectForUpdateExecutorTest method init.
@BeforeAll
public static void init() {
RootContext.unbind();
List<String> returnValueColumnLabels = Lists.newArrayList("id", "name");
Object[][] returnValue = new Object[][] { new Object[] { 1, "Tom" }, new Object[] { 2, "Jack" } };
Object[][] columnMetas = new Object[][] { new Object[] { "", "", "table_select_for_update_executor_test", "id", Types.INTEGER, "INTEGER", 64, 0, 10, 1, "", "", 0, 0, 64, 1, "NO", "YES" }, new Object[] { "", "", "table_select_for_update_executor_test", "name", Types.VARCHAR, "VARCHAR", 64, 0, 10, 0, "", "", 0, 0, 64, 2, "YES", "NO" } };
Object[][] indexMetas = new Object[][] { new Object[] { "PRIMARY", "id", false, "", 3, 1, "A", 34 } };
MockDriver mockDriver = new MockDriver(returnValueColumnLabels, returnValue, columnMetas, indexMetas);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
field.set(dataSourceProxy, "mysql");
connectionProxy = new MockConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
connectionProxy.bind("xid");
MockStatement mockStatement = new MockStatement(dataSource.getConnection().getConnection());
statementProxy = new StatementProxy(connectionProxy, mockStatement);
} catch (Exception e) {
throw new RuntimeException("init failed");
}
String sql = "select * from table_select_for_update_executor_test where id = 1";
List<SQLStatement> asts = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
MySQLSelectForUpdateRecognizer recognizer = new MySQLSelectForUpdateRecognizer(sql, asts.get(0));
selectForUpdateExecutor = new SelectForUpdateExecutor(statementProxy, (statement, args) -> {
return null;
}, recognizer);
}
use of io.seata.rm.datasource.StatementProxy in project seata by seata.
the class UpdateExecutorTest method init.
@BeforeAll
public static void init() {
List<String> returnValueColumnLabels = Lists.newArrayList("id", "name");
Object[][] returnValue = new Object[][] { new Object[] { 1, "Tom" }, new Object[] { 2, "Jack" } };
Object[][] columnMetas = new Object[][] { new Object[] { "", "", "table_update_executor_test", "id", Types.INTEGER, "INTEGER", 64, 0, 10, 1, "", "", 0, 0, 64, 1, "NO", "YES" }, new Object[] { "", "", "table_update_executor_test", "name", Types.VARCHAR, "VARCHAR", 64, 0, 10, 0, "", "", 0, 0, 64, 2, "YES", "NO" } };
Object[][] indexMetas = new Object[][] { new Object[] { "PRIMARY", "id", false, "", 3, 1, "A", 34 } };
MockDriver mockDriver = new MockDriver(returnValueColumnLabels, returnValue, columnMetas, indexMetas);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
field.set(dataSourceProxy, "mysql");
ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
statementProxy = new StatementProxy(connectionProxy, mockStatement);
} catch (Exception e) {
throw new RuntimeException("init failed");
}
String sql = "update table_update_executor_test set name = 'WILL'";
List<SQLStatement> asts = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
MySQLUpdateRecognizer recognizer = new MySQLUpdateRecognizer(sql, asts.get(0));
updateExecutor = new UpdateExecutor(statementProxy, (statement, args) -> {
return null;
}, recognizer);
}
Aggregations