seata 1.3.0 挂起,恢复,手动回滚,Data too long for column 'row_key' at row 1
1. 报错:Data too long for column 'row_key' at row 1
查看seata server DB的LockTable表,修改row_key字段长度,为Mysql DB时,修改为 768(InnoDB 的索引长度默认最大为 3072 字节 (每个字符占 4 字节), 3072 /4 = 768),pk字段也需调整为768
注意seata的DB的位置,可以在seata部署的文件夹中conf中file.conf找到,也可以同步看一下seata注册到的nacos上写的DB的配置,如果二者不一致,可以先修改在部署文件夹中找到的DB对应的row_key字段长度
2. 手动回滚
String xid = RootContext.getXID();
private void rollBackHandle(String xid) {
log.info("手动回滚Seata事务 {} start", xid);
if (RootContext.inGlobalTransaction()) {
try {
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
} catch (TransactionException e1) {
log.error("手动回滚Seata事务出现异常", e1);
}
}
log.info("手动回滚Seata事务 {} end", xid);
}
3. 挂起
String xid = RootContext.getXID();
private SuspendedResourcesHolder unBindHandle(String xid) {
log.info("手动挂起Seata事务 {} start", xid);
SuspendedResourcesHolder handle = null;
if (RootContext.inGlobalTransaction()) {
try {
handle = GlobalTransactionContext.reload(RootContext.getXID()).suspend();
} catch (TransactionException e1) {
log.error("手动挂起Seata事务出现异常", e1);
}
}
log.info("手动挂起Seata事务 {} end", xid);
return handle;
}
4. 挂起后的恢复
String xid = RootContext.getXID();
private void bindHandle(String xid, SuspendedResourcesHolder suspendedResourcesHolder) {
log.info("手动恢复Seata事务 {} start", xid);
if (RootContext.inGlobalTransaction()) {
try {
GlobalTransactionContext.reload(RootContext.getXID()).resume(suspendedResourcesHolder);
} catch (TransactionException e1) {
log.error("手动恢复Seata事务出现异常", e1);
}
}
log.info("手动恢复Seata事务 {} end", xid);
}

浙公网安备 33010602011771号