-
Notifications
You must be signed in to change notification settings - Fork 205
Open
Labels
bugSomething isn't workingSomething isn't working
Description
版本信息(Version)
2408
问题描述(Describe)
创建工单,上传SQL文件选择“SQL模式”后,进行审核上线,其中某条SQL执行失败的报错会体现在每个SQL的执行结果中。
截图或日志(Log)

如何复现(To Reproduce)
构建SQL文件,满足:
- 前面几条SQL可以执行成功
- 后续存在某SQL执行会失败
SQL模式审核上线该文件
查看执行结果
问题原因
SQL模式上线的工单SQLs会以事务去执行,当数据源插件执行到某SQL失败时,直接用该SQL执行失败的原因作为事务执行失败的报错,sqle将该报错添加到了事务中的每个SQL的执行结果里。
Lines 715 to 719 in fde9c04
results, txErr := a.plugin.Tx(context.TODO(), qs...) | |
for idx, executeSQL := range executeSQLs { | |
if txErr != nil { | |
executeSQL.ExecStatus = model.SQLExecuteStatusFailed | |
executeSQL.ExecResult = txErr.Error() |
解决方案
方案的目标都是使得:
type Plugin interface {
// ...
Tx(ctx context.Context, queries ...string) ([]driver.Result, error)
// ...
}
插件的Tx方法,在执行失败时,能够区分是哪条SQL失败。
- 执行某SQL失败时,之前执行成功的结果在第一个返回参数[]driver.Result中返回
- 优:部分前向兼容(接口兼容,业务逻辑不兼容)、效果良好
- 缺:隐性约定
- 在第二个返回参数error中表明哪个SQL失败的
- 优:前向兼容
- 缺:代码丑陋|实现效果不好
- 修改Tx方法签名,使其能够很好的区分哪条SQL执行失败
- 优:代码优雅
- 缺:前向不兼容
- 修改driver.Result,使其能够表示执行失败的错误
- 优:前向兼容、代码优雅、效果良好
- 缺:
变更影响面
受影响的模块或功能
外部引用的潜在问题或风险
版本兼容性
测试建议
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working