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