我想询问一下我现在想写一个从1开始的流水号没有异步,,我目前采取的是新增之后查询数据库获取最后一个然后自增的方式,在最后增加数据库的时候还会查询一下有没有重复的,想问问这样会有线程安全吗
自增入库 流水号不是主键是吧?
明显不安全,再说数据库连接是很宝贵的,这么搞很没有必要,数据库不是有自增id吗,直接设置自增id就行了
举个例子,如果你有两个线程都在执行这个操作,A线程先执行,查询了数据库,然后发现需要设置id为5,然后这时候线程切换了,A线程还没写入,B线程开始执行,查询数据库发现id也应该设置为5,这种情况两个线程都会写入id5,如果没有设置id唯一,那么两个线程都将成功执行
如果不能用数据库自增id,那么用缓存解决也行,比如redis有线程安全的自增方法Incr,或者就直接在程序里面写一个同步方法,专门获取id,每次自增+1都可以