use of io.seata.rm.datasource.undo.SQLUndoLog in project seata by seata.
the class FastjsonUndoLogParserTest method testWriteClassName.
@Test
public void testWriteClassName() throws Exception {
TableRecords beforeImage = new TableRecords();
TableRecords afterImage = new TableRecords();
afterImage.setTableName("t1");
List<Row> rows = new ArrayList<>();
Row row = new Row();
Field field = new Field();
field.setName("id");
field.setKeyType(KeyType.PRIMARY_KEY);
field.setType(Types.BIGINT);
field.setValue(Long.valueOf("0"));
row.add(field);
field = new Field();
field.setName("money");
field.setType(Types.DECIMAL);
field.setValue(BigDecimal.ONE);
row.add(field);
rows.add(row);
afterImage.setRows(rows);
SQLUndoLog sqlUndoLog00 = new SQLUndoLog();
sqlUndoLog00.setSqlType(SQLType.INSERT);
sqlUndoLog00.setTableName("table_name");
sqlUndoLog00.setBeforeImage(beforeImage);
sqlUndoLog00.setAfterImage(afterImage);
BranchUndoLog originLog = new BranchUndoLog();
originLog.setBranchId(123456L);
originLog.setXid("xiddddddddddd");
List<SQLUndoLog> logList = new ArrayList<>();
logList.add(sqlUndoLog00);
originLog.setSqlUndoLogs(logList);
// start test
byte[] bs = getParser().encode(originLog);
String s = new String(bs);
Assertions.assertTrue(s.contains("\"@type\""));
BranchUndoLog decode = getParser().decode(s.getBytes());
Object value1 = decode.getSqlUndoLogs().get(0).getAfterImage().getRows().get(0).getFields().get(0).getValue();
Object value2 = decode.getSqlUndoLogs().get(0).getAfterImage().getRows().get(0).getFields().get(1).getValue();
Assertions.assertTrue(value1 instanceof Long);
Assertions.assertTrue(value2 instanceof BigDecimal);
}
use of io.seata.rm.datasource.undo.SQLUndoLog in project seata by seata.
the class ConnectionContext method releaseSavepoint.
public void releaseSavepoint(Savepoint savepoint) {
List<Savepoint> afterSavepoints = getAfterSavepoints(savepoint);
savepoints.removeAll(afterSavepoints);
currentSavepoint = savepoints.size() == 0 ? DEFAULT_SAVEPOINT : savepoints.get(savepoints.size() - 1);
// move the undo items & lock keys to current savepoint
for (Savepoint sp : afterSavepoints) {
List<SQLUndoLog> savepointSQLUndoLogs = sqlUndoItemsBuffer.remove(sp);
if (CollectionUtils.isNotEmpty(savepointSQLUndoLogs)) {
sqlUndoItemsBuffer.computeIfAbsent(currentSavepoint, k -> new ArrayList<>(savepointSQLUndoLogs.size())).addAll(savepointSQLUndoLogs);
}
Set<String> savepointLockKeys = lockKeysBuffer.remove(sp);
if (CollectionUtils.isNotEmpty(savepointLockKeys)) {
lockKeysBuffer.computeIfAbsent(currentSavepoint, k -> new HashSet<>()).addAll(savepointLockKeys);
}
}
}
use of io.seata.rm.datasource.undo.SQLUndoLog in project seata by seata.
the class BaseTransactionalExecutor method prepareUndoLog.
/**
* prepare undo log.
*
* @param beforeImage the before image
* @param afterImage the after image
* @throws SQLException the sql exception
*/
protected void prepareUndoLog(TableRecords beforeImage, TableRecords afterImage) throws SQLException {
if (beforeImage.getRows().isEmpty() && afterImage.getRows().isEmpty()) {
return;
}
if (SQLType.UPDATE == sqlRecognizer.getSQLType()) {
if (beforeImage.getRows().size() != afterImage.getRows().size()) {
throw new ShouldNeverHappenException("Before image size is not equaled to after image size, probably because you updated the primary keys.");
}
}
ConnectionProxy connectionProxy = statementProxy.getConnectionProxy();
TableRecords lockKeyRecords = sqlRecognizer.getSQLType() == SQLType.DELETE ? beforeImage : afterImage;
String lockKeys = buildLockKey(lockKeyRecords);
if (null != lockKeys) {
connectionProxy.appendLockKey(lockKeys);
SQLUndoLog sqlUndoLog = buildUndoItem(beforeImage, afterImage);
connectionProxy.appendUndoLog(sqlUndoLog);
}
}
use of io.seata.rm.datasource.undo.SQLUndoLog in project seata by seata.
the class MySQLUndoUpdateExecutorTest method init.
@BeforeAll
public static void init() {
TableMeta tableMeta = Mockito.mock(TableMeta.class);
Mockito.when(tableMeta.getPrimaryKeyOnlyName()).thenReturn(Arrays.asList(new String[] { "id" }));
Mockito.when(tableMeta.getTableName()).thenReturn("table_name");
TableRecords beforeImage = new TableRecords();
beforeImage.setTableName("table_name");
beforeImage.setTableMeta(tableMeta);
List<Row> beforeRows = new ArrayList<>();
Row row0 = new Row();
addField(row0, "id", 1, "12345");
addField(row0, "age", 1, "1");
beforeRows.add(row0);
Row row1 = new Row();
addField(row1, "id", 1, "12346");
addField(row1, "age", 1, "1");
beforeRows.add(row1);
beforeImage.setRows(beforeRows);
TableRecords afterImage = new TableRecords();
afterImage.setTableName("table_name");
afterImage.setTableMeta(tableMeta);
List<Row> afterRows = new ArrayList<>();
Row row2 = new Row();
addField(row2, "id", 1, "12345");
addField(row2, "age", 1, "2");
afterRows.add(row2);
Row row3 = new Row();
addField(row3, "id", 1, "12346");
addField(row3, "age", 1, "2");
afterRows.add(row3);
afterImage.setRows(afterRows);
SQLUndoLog sqlUndoLog = new SQLUndoLog();
sqlUndoLog.setSqlType(SQLType.UPDATE);
sqlUndoLog.setTableMeta(tableMeta);
sqlUndoLog.setTableName("table_name");
sqlUndoLog.setBeforeImage(beforeImage);
sqlUndoLog.setAfterImage(afterImage);
executor = new MySQLUndoUpdateExecutor(sqlUndoLog);
}
use of io.seata.rm.datasource.undo.SQLUndoLog in project seata by seata.
the class OracleUndoDeleteExecutorTest method upperCase.
private OracleUndoDeleteExecutor upperCase() {
TableMeta tableMeta = Mockito.mock(TableMeta.class);
Mockito.when(tableMeta.getPrimaryKeyOnlyName()).thenReturn(Arrays.asList(new String[] { "ID" }));
Mockito.when(tableMeta.getTableName()).thenReturn("TABLE_NAME");
TableRecords beforeImage = new TableRecords();
beforeImage.setTableName("TABLE_NAME");
beforeImage.setTableMeta(tableMeta);
List<Row> beforeRows = new ArrayList<>();
Row row0 = new Row();
addField(row0, "ID", 1, "1");
addField(row0, "AGE", 1, "1");
beforeRows.add(row0);
Row row1 = new Row();
addField(row1, "ID", 1, "1");
addField(row1, "AGE", 1, "1");
beforeRows.add(row1);
beforeImage.setRows(beforeRows);
TableRecords afterImage = new TableRecords();
afterImage.setTableName("TABLE_NAME");
afterImage.setTableMeta(tableMeta);
List<Row> afterRows = new ArrayList<>();
Row row2 = new Row();
addField(row2, "ID", 1, "1");
addField(row2, "AGE", 1, "2");
afterRows.add(row2);
Row row3 = new Row();
addField(row3, "ID", 1, "1");
addField(row3, "AGE", 1, "2");
afterRows.add(row3);
afterImage.setRows(afterRows);
SQLUndoLog sqlUndoLog = new SQLUndoLog();
sqlUndoLog.setSqlType(SQLType.DELETE);
sqlUndoLog.setTableMeta(tableMeta);
sqlUndoLog.setTableName("TABLE_NAME");
sqlUndoLog.setBeforeImage(beforeImage);
sqlUndoLog.setAfterImage(afterImage);
return new OracleUndoDeleteExecutor(sqlUndoLog);
}
Aggregations