当前位置:首页 > 算法 > 正文内容

jfinal 乐观锁

canca6年前 (2020-03-31)算法590

继承Model类,实现自己的BaseModel,重写save()和update()方法,然后所有的Model都继承自BaseModel

 /**
  * 重写save方法
  */
 public boolean save() {
  this.set(getTable().getPrimaryKey(), ToolUtils.getUuidByJdk(true)); // 设置主键值
  if(getTable().hasColumnLabel("version")){ // 是否需要乐观锁控制
   this.set("version", Long.valueOf(0)); // 初始化乐观锁版本号
  }
  return super.save();
 }
/**
  * 重写update方法
  */
 @SuppressWarnings("unchecked")
 public boolean update() {
  Table table = getTable();
  String name = table.getName();
  String pk = table.getPrimaryKey();
  
  // 1.数据是否还存在
  String sql = new StringBuffer("select version from ").append(name).append(" where ").append(pk).append(" = ? ").toString();
  Model<M> modelOld = findFirst(sql , getStr("ids"));
  if(null == modelOld){ // 数据已经被删除
   throw new RuntimeException("数据库中此数据不存在,可能数据已经被删除,请刷新数据后在操作");
  }
  
  // 2.乐观锁控制
  Set<String> modifyFlag = null;
  try {
   Field field = this.getClass().getSuperclass().getSuperclass().getDeclaredField("modifyFlag");
   field.setAccessible(true);
   Object object = field.get(this);
   if(null != object){
    modifyFlag = (Set<String>) object;
   }
   field.setAccessible(false);
  } catch (NoSuchFieldException | SecurityException e) {
   log.error("业务Model类必须继承BaseModel");
   e.printStackTrace();
   throw new RuntimeException("业务Model类必须继承BaseModel");
  } catch (IllegalArgumentException | IllegalAccessException e) {
   log.error("BaseModel访问modifyFlag异常");
   e.printStackTrace();
   throw new RuntimeException("BaseModel访问modifyFlag异常");
  }
  boolean versionModify = modifyFlag.contains("version");
  if(versionModify && getTable().hasColumnLabel("version")){ // 是否需要乐观锁控制
   Long versionDB = modelOld.getLong("version"); // 数据库中的版本号
   Long versionForm = getLong("version"); // 表单中的版本号
   if(!(versionForm > versionDB)){
    throw new RuntimeException("表单数据版本号和数据库数据版本号不一致,可能数据已经被其他人修改,请重新编辑");
   }
  }
  
  return super.update();
 }
 /**
  * 获取表映射对象
  * 
  * @return
  */
 public Table getTable() {
  return TableMapping.me().getTable(getClass());
 }

所有需要乐观锁控制的表都加上version字段,在更新数据的表单页面加上

<input type="hidden" name="version" value="${version + 1}">


扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/703.html

标签: 算法
分享给朋友:

“jfinal 乐观锁” 的相关文章

MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

为了方便测试,博主使用最新的jfinal框架,里边的东西就修改了一下a_little_config.txt,配置数据库链接的,启动直接打开DemoConfig.java,main方法启动即可(记得修改端口),这样就不用再去写jdbc了。感兴趣的朋友可以去了解一下:主要源码(模拟120人同时抢购100...

不同概率的抽奖

需求很简单,为了更加形象,这里我们列一个表格来显示我们抽奖的物品和对应的概率(没有边框,大家凑合着看看吧,不想改造Octopress的样式了)序号物品名称物品ID抽奖概率1物品1P10.22物品2P20.13物品3P30.44物品4P40.35物品5P50.06物品6P6-0.17物品7P70.00...

MySQL Redis分布式锁实现秒杀案例(jfinal框架)

我们加锁就一行代码:jedis.set(String key, String value, String nxxx, String expx, int time),这个set()方法一共有五个形参:    第一个为key,我们使用key来当锁,因为key是唯一...

zookeeper分布式锁实现秒杀案例(jfinal框架)

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的架构通过冗余服务实现高可用性。...

MySQL乐观锁 实现秒杀案例,增加version字段来判断(jfinal框架)

MySQL乐观锁和悲观锁的主要区别在于:悲观锁在查询的时候就认为别人会和我抢,我查询的时候就先锁起来。乐观锁在查询的时候认为别人不会和我抢,我在更新的时候判断一下就可以了。所以如果在高并发的情况下,博主认为乐观锁并不适合做这种业务,因为是先查询,导致数据库有很多的更新失败,处理异常再次执行的情况,相...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。