业务系统经常锁定业务数据需求,当我操作某一业务数据时,希望当前数据不会他人修改。
如在病人结算时,不希望同时医生还为患者写医嘱,或医生为患者下医嘱时,不允许其它医生为同一患者下医嘱。为解决此问题,提供一锁记录接口,接口说明如下:
d ##class(websys.Lock).Lock(lockOid,sessionid, userid, .returnmsg, loginlocation, timeout)
入参 | 说明 | 备注 |
---|---|---|
lockOid | 要锁的记录,结构为:$Lb(记录id,”表名”) | 记录被锁后,再锁同一lockOid会失败 |
sessionid | 会话id | |
userid | 当前用户id | |
returnmsg | 锁失败时会立即写信息到returnmsg中 | 成功时值为空字符串 |
loginlocation | 登录科室id | |
timeout | 锁住最长时间(单位秒)。可以为空,为空表示一直锁住直到切换菜单或退出系统。timeout有值时不会自动清此锁,只是超时后,别人再锁会忽略此锁且清除此锁 | iMedical8.4 新加 |
示例:
/// 医生1在102科室Ab21J89T会话下锁住医嘱52250记录
d ##class(websys.Lock).Lock($Lb(52250,"User.OEOrder"),"Ab21J89T",1,.msg,102)
w msg // 为空字符,表示成功锁住,可以做业务操作
/// 医生2在102科室Ab21J89Q会话下请求锁住医嘱52250记录
d ##class(websys.Lock).Lock($Lb(52250,"User.OEOrder"),"Ab21J89Q",2,.msg,102)
w msg // 得到失败提示:记录被锁,请联系管理员。(医生1 | 内三科 | 1.1.1.1 | ComputerName1234 | 2022-03-11 10:00:19)
// 表示有人锁住了,不能使用, 提示相应锁信息给医生2
当界面关闭,或切换到其它界面时,可以使用LockClear方法解锁
d ##class(websys.Lock).LockClear(lockOid, sessionid)
入参 | 说明 | 备注 |
---|---|---|
lockOid | 要锁的记录,结构为:$Lb(记录id,”表名”) | 记录被锁后,再锁同一lockOid会失败 |
sessionid | 会话id |
联系基础平台组更新类:websys.Lock
扩展了一个解锁的方法,方便前端发起解锁。
d ##class(websys.Lock).LockClear2(classId1, className1, sessionid)
入参 | 说明 | 备注 |
---|---|---|
classId1 | 要锁的记录,表的id | |
className1 | 要锁的记录,表的类名 | |
sessionid | 会话id |
d ##class(websys.Lock).LockClearSession(sessionid)
d ##class(websys.Lock).LockClearComputer(comp)
访问量: 509805
1条评论