java吧 关注:1,273,886贴子:12,786,692
  • 2回复贴,共1

请问为了避免重复写入,使用触发器可以吗?

只看楼主收藏回复

最近遇到了一个问题,是这样的,数据库里面有一列,这一列是一个外键,int类型,但是默认可以为空,基于业务。
如果这个键值是空,则可以允许重复,比如一条记录中,这一个键是nil,则可以由很多这种记录。但是,如果这个键值不为空,比如这个键值是10,那整个数据表里面只能有一条记录拥有10这个值。
之前踩过一次坑,是之前某个人踩得,因为数据来的很快,而且是多线程,出现了重复写的情况,因为原来的逻辑是,我0-1秒查,1-3秒生成实例,3-4秒写入,但是1-3秒之间可能又来一个一样的,因为之前的还没写入,新来的也认为应该生成实例,就出现了重复写。
我当时直接简单粗暴的加了个锁,加了个“我写入之前,不许任何人碰这个表”的锁,直到我弄好了为止,但是这样效率太低就放弃了。
后来有人让我把锁拆了,想别的办法。
我现在在想,是否可以用trigger,我的想法是,插入之前,会触发trigger,trigger会先判断插入的数据这个值是否为空,为空,则直接 放行,不为空,在数据库里面查询,如果查到发现已经存在了,返回自定义错误。但是我看了很多文献,发现触发器好像不推荐使用。请问还有啥别的推荐吗?还是这种情况可以用触发器。


1楼2019-10-10 14:27回复
    不建议使用触发器 首先你要搞清楚这个是否可以重复的业务逻辑是什么 然后估测一下这种情况多不多 你为啥要直接锁表啊?用行锁不行吗?或者乐观锁


    2楼2019-10-10 15:05
    回复
      2025-08-14 07:57:37
      广告
      不感兴趣
      开通SVIP免广告
      可以考虑一下这样子: 那一列是int类型,既然这样,那就搞个布隆过滤器就行了,效率极高,但是java堆内存有点占用高,
      static final int length=1024*1024
      static fianl boolean[] flags=new boolean[length];
      void init(){
      for(int i in dbClumns)
      //如果数据库有一个数字num,flags[num]=true;
      }
      }
      。。。。。。。。。。。。。


      IP属地:河南3楼2019-10-10 15:46
      回复