想往数据库里插入一条记录,但数据库中已经有了此记录,所以插不进去。我的想法是:在插入数据库之前,先在 java 类中判断数据库中是否有了相同的记录,
            如果有,则提示有重复记录;
            如果没有,则可以插入这条记录;不知道想法我的想法是否正确,待朋友们指点和给出具体的实现方案。

解决方案 »

  1.   

    根据条件查询是否有数据,有返回true否则返回false
      

  2.   

    在一定的情况下,可以这样去实现,因为这个出错的概率几乎为0,当然也不排除出错的可能性,那就是并发了。但是这个对于普通的系统来说几乎不太可能发生如此小的概率事件,其实从你发起验证到验证、验证结束、插入数据、提交数据,这个过程(可能你通过网络异步AJAX验证会消耗网络传送时间),那么就可能出现两个或两个以上的请求验证都是成功的并插入同一条记录。我不清楚你说的同一条记录是什么意思,是编号相同还是很多字段相同,如果是编号相同我认为用ORACLE自带的序列管理器或自定义序列管理器就可以实现。如果你真需要完全无误的错误,那种即为小的概率事件都不放过的话,其实较为保险的还是用唯一性约束来控制,但是它会造成后来者抛一个异常,而且在高并发插入表中可能会导致阻塞问题(因为约束将使得插入进行检查的序列化检查过程)。
      

  3.   

    补充一下,如果你想将这种小概率事件放弃掉,而且又不愿意用约束,此时在JAVA代码中的方法做一个同步操作,可以相对一个对象,如果当前的DAO层为一个单例,那么可以相对this或直接在方法体上使用synchronized进行同步操作。意思就是在对这个共享资源的使用的过程中,只允许最多一个线程在执行,多个线程谁先抢到谁执行,后面来的必须等待,也就是不可能有两个线程同时调用校验方法和提交方法,不过你真要这样做,就不能使用客户端发出请求了,因为校验和提交必须一起完成。这样有点影响性能,对高并发业务同样不适用,其实和约束道理也是差不多,就是序列化,要控制并发,基本的思路都是序列化,只是如何序列化才能降低粒度,在那个地方序列化更加适合系统规范。
      

  4.   

    这种事让数据库替你做吧,你捕获unique异常即可。
      

  5.   


    小胖说的甚合我意,嘻嘻。
    以前用ajax做过,当时还为自己学会了ajax而洋洋自得,看了小胖说的,觉得自己,哎~~
      

  6.   


    做联合唯一性约束嘛,又不一定非要一个字段。如:
    create unique index UK_TEST on ORD_WORK_ORDER (字段1, 字段2);虽然唯一性约束是避免小概率事件的一种方式,不过在JAVA的编码中我们一般不通过异常去控制流程,至少将这种情况降得很低(因为通过高可用性验证以及源码的说明,对于异常控制流程的消耗是很大的)。
      

  7.   

    用AJAX在前台判断下,如果有的话,不让它提交不就得了。
      

  8.   

    用dwr和ajax都可以,服务端去判断下可以用来确定是否重复的字段即可
      

  9.   

    方法1:使用Ajax进行无刷新查询
    方法2:唯一性设置,捕获重复异常。