使用com.databricks.spark.sqldw写入Synapse DWH失败是否会回滚操作
Databricks
com.databricks.spark.sqldw 连接器写入Synapse的ACID属性与异常处理方案 写入失败的回滚规则
com.databricks.spark.sqldw 连接器默认对append和overwrite两种写入模式都实现了原子性保证,中途失败不会产生残留的部分写入数据:
- overwrite模式:底层先将全量数据写入Synapse侧临时表,校验数据完整性后通过原子DDL操作替换原表。写入过程任何环节失败都会自动清理临时表,原表数据不会被修改。
- append模式:全量待写入数据会先同步到临时存储,确认所有分片写入成功后,再通过单事务批量插入目标表。失败后临时数据自动清理,目标表不会新增不完整数据。
仅当你手动修改了默认事务配置、使用低于2.4.0的老旧版本连接器,或临时目录权限配置异常时,才可能出现原子性失效的情况,建议保持官方默认配置。
两类异常的处理逻辑
两种异常的触发场景完全不同,可分别设计处理逻辑:
SqlDWConnectorException:为连接器侧抛出的异常,常见原因包括参数配置错误、权限不足、Spark侧资源不足、临时存储访问失败等,这类故障属于非瞬时故障,重试无法解决,不需要加入重试逻辑,直接抛出告警排查配置即可。SqlDWSideException:为Synapse服务端返回的异常,常见原因包括Synapse实例资源耗尽、锁冲突、网络抖动、事务超时等,这类故障多为瞬时故障,可在try-catch块中捕获后加入指数退避重试逻辑,重试3-5次仍失败再触发告警。
兜底方案建议
即便连接器默认满足原子性,核心业务场景仍建议做如下兜底:
- 写入前先对DataFrame做schema一致性、非法值校验,避免因数据问题触发写入失败
- 捕获任意异常后,都执行一次临时目录残留文件清理,避免占用存储资源
- 写入完成后可新增行计数校验,比对源DataFrame和目标表新增行数,确认写入完整性
内容的提问来源于stack exchange,提问作者halfwind22
相关产品推荐
相关产品推荐

