问题描述
有一个对象User(对应数据库中t_user表),User有一个字段code.现在有一个方法edit(),edit方法每次通过User的code值来生成新的code值,就是说,如果现在数据库中code的最大值为10,那么edit方法新增一个User对象,这个User对象的code值为11,然后将新的User对象保存。现在的问题是如果多个用户同时执行到edit方法,会导致User记录的code 值重复,应该怎么解决??(获取code的最新值有一个特定方法:getNextCode)
解决方案
edit方法同步
解决方案二:
真是给楼主跪了。。有很多地方可以来保证Code的唯一,选了范围最大的一个直接加同步
解决方案三:
可能的解决方法有1、使用数据库中的序列来给code赋值2、使用synchronized,或者lock将共享的数据同步3、可以使用Concurrent 包中的 BlockingQueue来缓存一些code值,BlockingQueue能很好的在多线程中传递数据。实现:1、在数据库中建立序列,通过getNextCode来获取序列的值,因为序列式自增长的,所以支部会重复。这种效率会慢一点,因为你要不断的访问数据库来获取序列的值2、为getNextCode加上同步锁, synchronized getNextCode()或者 getNextCode(){ .... lock(); //获取共享数据的代码块 unlock(); .... }3、BlockingQueue<String> queue = new LikedBlockQueue<String>(queueSize);//初始化队列中的数据for(int i=0;i<queueSize;i++) queue.offer(getNextCode());当然上边的方法还有很多的写法,你可以自己决定使用什么样的实现
解决方案四:
重复的值是指执行更新的时候却执行了插入吗?
解决方案五:
至少有2种方式你可以尝试1 getNextCode这里加锁2 可以使用类似hibernate中的乐观锁