为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8企业版
【操作系统】:kylin
【CPU】:
【问题描述】*:基于达梦的应用系统有个导入数据的功能,该功能有个导入数据用的中间表,每个批次导入的时候最多20行记录,导入完成后可以丢弃,由于在导入的时候按批次号删除20万行数据需2秒,影响性能,所以考虑使用定时任务每天凌晨清理数据(truncate表),一般凌晨不会有数据插入。
但我担心的是,万一有,那么可能出现在truncate表的同时,用户使用了导入功能,触发了插入数据的操作,此时会造成锁表吗?
对于中间表,且数据是一过性的,可以试试用事务型临时表,不同会话间数据不会冲突,且提交事务后临时表当前会话数据会自动清空。
如果有大批量的插入,事务未提交,可能导致truncate操作失败,报错“-6407: 锁超时”的
1、truncate是DDL操作给对象上X锁,所以和其他操作相互排斥不能同时进行,增删改都不行更不能并发进行锁级别更高的FAST LOAD,但好在truncate很快,冲突的可能性也小,所以安排在表访问低峰时段是合理的;
2、为了预防万一,您可以使用达梦的“作业系统”,见https://eco.dameng.com/document/dm/zh-cn/pm/job.html,配置失败重试n次,或者多个调度在间隔一定时间多次尝试,日常可以查看作业执行记录了解其是否成功执行
truncate和insert是不会冲突的。数据库会按照事务的先后顺序执行