如何避免NetSuite‘记录已被更改’错误?批量处理场景咨询
我开发了一个Scheduled Script,用于为每个发票项目创建Journal Entry记录,目前包含两个函数:第一个函数为发票记录的所有项目创建Journal Entry;第二个函数将已创建的Journal Entry记录引用设置到发票记录的sublist中。
为避免使用量问题,我在第一个函数中添加了reschedulescript逻辑。若按50个项目批量创建Journal Entry并更新发票行,之后在第二个函数中执行重调度,需每处理50个项目就保存一次发票记录,我担心这会触发‘记录已被更改’错误,恳请提供建议。
伪代码
function execute() { //Fetches data from saved search and create journal entries createjournals(); } function createjournals() { //create Journal entries journal.save if(remainingusage<100) { reschedulescript(); } if(createdjearray.length>0) { updateinvoicelines(); } } function updateinvoicelines() { //set Journal entries references on invoice item line invoice.save(); }
解决方案建议
每次更新前重新加载发票记录:在
updateinvoicelines函数开头,不要直接使用之前缓存的发票对象,而是用nlapiLoadRecord(SuiteScript 1.0)或record.load(SuiteScript 2.x)重新加载当前要更新的发票。确保拿到最新的记录状态,避免因其他操作导致的版本不一致。利用版本号校验避免冲突:NetSuite记录包含
version字段,保存前可先对比当前加载记录的版本与数据库中的最新版本。SuiteScript 2.x可使用record.check方法,SuiteScript 1.0可通过搜索获取当前版本,不匹配则重新加载记录后再处理。优化批量处理逻辑:调整重调度时机,确保每个批次的Journal Entry创建、发票行更新完成后再保存发票并触发重调度,减少不必要的保存次数。比如等当前50条项目处理完毕,更新发票行并保存后再执行重调度,而非中途打断。
使用排他锁(SuiteScript 2.x):加载发票记录时添加
{lock: true}参数,脚本处理期间锁定该发票,阻止其他操作修改,直到保存或放弃记录。注意控制锁的持有时间,避免影响其他业务流程。添加错误重试机制:在
invoice.save()处包裹try-catch块,捕获“记录已被更改”错误时,自动重新加载记录、重新应用更新并重试保存(设置3次以内的重试上限),处理偶发冲突。
内容的提问来源于stack exchange,提问作者Maira S

