如何用Oracle的存储过程来防止多人同时操作数据提交页面,造成重复的情况?

解决方案 »

  1.   

    如果是避免同时操作一条记录,就使用
    select_statement for update
    如果是避免插入的记录重复,建立表的主键,或者是唯一索引
      

  2.   


    --方法有很多中,这个就看楼主想用什么类型了!
    --楼主可以参考下面这样的
    --创建两个存储过程:1个用来进行排他处理,一个用来进行解除排他处理
    --排他
    CREATE OR REPLACE FUNCTION LOCKSET
    ...--接触
    CREATE OR REPLACE FUNCTION LOCKCLR
    ...--原理很简单:LOCKSET中,你可以根据你的客户端名称,插入一条数据
    --                       然后再访问之前,要先判断有没有这条数据,如果有,就不能操作了
    --            LOCKCLR中,你操作完成后,解决LOCK状态,删除这条数据
      

  3.   

    避免重复就是表上加主键
    然后sp去catch主键冲突的错误,返回友好的错误的提示给客户端就可以了
      

  4.   


    是这样的,我们是用的ASP.NET开发的页面,客户在提交填写的内容时,在结果页面出现过两条相同的记录,具体客户是怎么操作的不清楚,现在要求能做着判断以防止这样的错误发生。程序中调用的是一段存储过程执行插入操作。
      

  5.   

    给你打个比方吧
    如果你的提交的页面出现两条重复的记录,我首先不管他是怎么来的,这个应该是个程序的bug,
    1.如果你的提交做的update操作
    我把更新的这条记录for update 行锁,我就不管我的用户点哪个,反正由数据库来处理,请求先到的先for update ,后到的请求报错(系统繁忙之类的错误,忽悠下客户),代表这条记录已经有人在操作。
    2.如果你的做的insert操作,这个自然使用唯一索引来保证就行了,这个我就不说了。大家都知道。
      

  6.   


    设置主键就可以了 或者你页面判断是否存在此记录 JSP
      

  7.   

    如果是这样的话,估计是前台还没有检验机制
    比如,提交的同时,对唯一键值进行判断(如单号、主题号等),这样,就算是重复提交,页面也有了相应提示,让用户知道哪错了。
    放在后台,虽然可以解决,用户可不认为那是重复提交,会因为相应的错误提示,会造成用户又说,这是一个BUG。
    建议,后台控制的同时,前台跟进。
      

  8.   


    //如果是这个样子的话,你其实不必要像我3楼说的建立函数了。
    //很简单就可以
    1.事务开启
    2.select count(*) from yourTab where id = '你要插入数据的主Key'
    3.上面得到的count > 0的话,就提示出错“主键重复”
    4.如果=0就 insert yourTab valuus(...)