spring項目對某條單據(jù)進行加鎖處理的方法
最近工作中有個對工單單據(jù)進行加鎖/解鎖處理,目的是為了防止多用戶對同一條單據(jù)處理。以下是完整的前后端代碼。
前端JS billLock.js
let orderLock = {
orderLock:(viewmodel, id, billType)=>{
var url = '/orderLock/lock?domainKey='+viewmodel.getDomainKey();
var proxy = cb.rest.DynamicProxy.create({
ensure: {url: url, method: 'POST'}
});
let data = {"id":id, "billType": billType, "ttl": 60*60*12}
proxy.ensure(data, function (err, result) {
if (err) {
cb.utils.alert(err.message, 'error');
} else {
cb.utils.alert(result, 'info');
if(viewmodel.originalViewMeta.cBillNo && viewmodel.originalViewMeta.cBillNo=="02924ed1"){
//維修領料頁面進入
if(result.indexOf('成功') <= 0){
viewmodel.biz.action().common.browse(viewmodel)
viewmodel.biz.action().common.setMode(viewmodel,"browse");
}
}else{
if(result.indexOf('成功') <= 0){
viewmodel.biz.action().common.browse(viewmodel)
}
}
}
})
},
unOrderLock:(viewmodel, id, billType)=>{
var url = '/orderLock/unLock?domainKey='+viewmodel.getDomainKey();
var proxy = cb.rest.DynamicProxy.create({
ensure: {url: url, method: 'POST'}
});
var data = {"id":id, "billType": billType}
proxy.ensure(data, function (err, result) {
if (err) {
cb.utils.alert(err.message, 'error');
} else {
cb.utils.alert(result, 'info');
}
})
}
}
export default orderLock后端Java 代碼
@RestController
@RequestMapping("/orderLock")
@Slf4j
public class OrderLockController extends BaseController {
@Autowired
private GmsRedisUtil gmsRRedisUtil;
@Autowired
private UserInfoService userInfoService;
private String ENGINE_NO = "afterservice";
/**
* 加鎖
*/
@PostMapping(value = "/lock")
public void orderLock(@RequestBody OrderLockDTO orderLockDTO, HttpServletResponse response) {
try{
String result;
UserExtendDto userExtendDto = userInfoService.getUserExtend();
String nowDate = DateUtil.dateFormat(PartCommonConstants.dateTimeFormatter, LocalDateTime.now());
String key = ENGINE_NO + "_" + orderLockDTO.getBillType() + "_" + orderLockDTO.getId();
String message = "鎖定人["+userExtendDto.getStaffName()+"]鎖定時間["+nowDate+"]";
Boolean flag = gmsRRedisUtil.tryGetLock(key, message, orderLockDTO.getTtl(), 2);
if(flag){
result = "加鎖成功!";
}else{
String lockValue = gmsRRedisUtil.getObject(key);
if(lockValue.contains(userExtendDto.getStaffName())){
result = "加鎖成功!原鎖定用戶["+userExtendDto.getStaffName()+"]進入單據(jù)!";
}else{
result = "加鎖失敗!單據(jù)已被鎖定,"+lockValue;
}
}
renderJson(response, ResultMessage.data(result,false));
}catch(Exception e){
renderJson(response, ResultMessage.error(e.getMessage()));
log.error("加鎖失敗:{}",e);
}
}
代碼解析(以上代碼大致步驟如下:)
1. 前端代碼 參數(shù)是data,帶有id,billtype,字符串ttl,時間變量 4個參數(shù)穿入后端。
2.后端接收參數(shù),調用gmsRRedisUtil.tryGetLock,這個方法是項目框架自己封裝,原理是實現(xiàn)了redisTemplate.opsForValue().setIfAbsent方法


3.setIfAbsent方法簡單介紹如下:
1.setIfAbsent(K var1, V var2);
如果key不存在則新增,key存在不做任何操作
redisTemplate.opsForValue().setIfAbsent("BBB", "好的");
2.setIfAbsent(K var1, V var2, long var3, TimeUnit var5)
如果key不存在則新增,同時設置過期時間,key存在不做任何操作。
redisTemplate.opsForValue().setIfAbsent("AAA", "好的", 1, TimeUnit.MINUTES);
3.setIfAbsent(K key, V value, Duration timeout)
如果key不存在則新增,同時設置過期時間,key存在不做任何操作。
redisTemplate.opsForValue().setIfAbsent("BBB", "好的", Duration.ofMinutes(1));
4.如果單據(jù)第一次進入,key不存在,flag為true,直接返回給前端“加鎖成功”,前端解析字符串中含有“成功,不設置頁面為瀏覽態(tài),仍為編輯態(tài)
本次加鎖我調用的是第2個方法,這里的第一個參數(shù)key可見是單據(jù)id加一些特定字符。所以單據(jù)id就會被加鎖,并設置加鎖時間\
5 如果單據(jù)在已經(jīng)加鎖的情況下,仍有其他用戶編輯此單據(jù),則key重復,gmsRRedisUtil.tryGetLock不做操作。
gmsRRedisUtil.getObject(key)實際是調用redisTemplate.opsForValue().get(key) 方法,
其中 get(Object var1) 是獲取指定的key對應的值。
第一次加鎖的message是用戶信息,這里如果是不同用戶登錄的話,
if(lockValue.contains(userExtendDto.getStaffName())) 就為false,返回給前端的信息是“加鎖失敗...”,
前端獲取字符串信息中沒有加鎖成功,會設置頁面為瀏覽態(tài),不能編輯。 到此,加鎖完成!

總結
到此這篇關于spring項目對某條單據(jù)進行加鎖處理的文章就介紹到這了,更多相關spring某條單據(jù)加鎖處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用itextpdf實現(xiàn)生成PDF并添加圖片,水印和文字
這篇文章主要為大家詳細介紹了Java在使用itextpdf實現(xiàn)生成PDF時如何實現(xiàn)添加圖片,水印和文字等效果,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02
Java 如何快速,優(yōu)雅的實現(xiàn)導出Excel
這篇文章主要介紹了Java 如何快速,優(yōu)雅的實現(xiàn)導出Excel,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下2021-03-03
JavaEE初階教程之Java?IO流讀寫與文件操作實戰(zhàn)
在Java編程中IO流是進行文件讀寫操作的重要組成部分,IO流提供了一種靈活、可靠的方式來處理文件和數(shù)據(jù)流,這篇文章主要介紹了JavaEE初階教程之Java?IO流讀寫與文件操作實戰(zhàn)的相關資料,需要的朋友可以參考下2025-12-12

