1,第一个问题我不清楚。
2,第二个问题我不明确。
3,第三个问题我很负责任的告诉你ROLLBACK的功能是 "清除自事务的起点或到某个保存点所做的所有数据修改并释放由事务控制的资源".MS没有告诉你他还有相当于return或其它语言中exit,quit,end之类的功能。

解决方案 »

  1.   

    第一,
    并发现象,数据库的并发和我们对数据库操作的并发好象不大一样。至少数据库在操作时会把表锁住,同一刻只有一个进程在操作啊。你所说的并发是同时对数据库进行修改,比如。
    表XX有字段yy,zz
    update XX set yy=1 where zz=1;而另一个用户却是
    update XX set yy=2 where zz=1;那么第一个修改就被覆盖掉了,这样的并发吧?
    但其实,在控制“并发”这样的方面,我们应该使用
    update xx set yy=1 where yy=?? and zz=??
    但第一次修改时,第二次就没有用了。为什么,因为yy已经不同了,所以就有效的控制了,你如果熟悉pb的数据窗口就知道了,第二次操作是脏数据了!!第二,
    你的错误我在第一点有提到一些,
    其实并发是靠我们去控制的,数据库不能避免的。比如上面的例子:
    表XX有字段yy,zz
    update XX set yy=1 where zz=1;
    update XX set yy=2 where zz=1;
    同时运行这两个命令,你说数据库怎么做呢?他会说是并发了,我不干了吗?
    如果他不干了,这个数据库有什么价值??
    不要把所有的责任都推向数据库,并发控制靠自己。
    第三,
    第三,对于Rollbakck Transaction操作,是不是执行到该语句后,它后面的语句还是要继续执行吗?是不是像return那样就停止后面的语句了?
    ---------------------------------
    Rollbakck Transaction操作只是返回上次提交到这里对数据库的修改,而不是结束操作,所以还继续运行
      

  2.   

    1.并发操作不一定会产生并发问题,同时执行select * 的操作也是并发操作,但不会产生并发问题。   并发问题包括:     1.丢失或覆盖更新。(幻像读)    2.未确认的相关性(脏读)。    3.不一致的分析(不可重复读)。  楼主可以google,baidu一下
      

  3.   

    各位,因为在我的程序中,偶尔会出现进程ID为58已经被其他进程使用这样的错误页面,或者是进程被占用的错误,我想是不是并发问题引起的,因为这种现象只是在执行一个存储过程时会出现,这个存储过程会执行系列的insert和select操作,我实在是苦恼,不知如何下手修改?
      

  4.   

    to wangdehao(找找找(现在很幸福)) 大侠:我刚才去搜索了一下你说的问题:丢失更新 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、 
    每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。 脏读 
    当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。 
    第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。 不可重复读 当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。 
    不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。 
    然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。 幻像读 当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。 
    事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。 
    这些原理感觉都说的有点概念化,具体到sql语句或例子中,如何说明?我感觉我程序的原因很可能是"幻像读"这一点,如果别的没时间解释,这一点能不能具体说一下或用例子说明都行,原理太抽象了,谢谢了.
      

  5.   

    To:DoNotTomcat(TOM) 
    你查的资料上面说的比较清楚了,
    http://www.daima.com.cn/Info/33/Info32849/
    这有例子,你看一下吧
      

  6.   

    操作的并发会产生数据库的数据错误,不一定是数据库的并发,一个很简单的列子
    现在库里有20个货物,终端a卖出去一个,那么他读出20,然后卖出一个,然后20-1=19,把19写会数据库
    在终端a读出数据还没有写回去的时候,终端b也卖了一个,由于19没写回去,那么他读出20,卖了一个,20-1=19,写会数据库
    虽然卖出了2个,可是数据确是19。
    所以并发有时候是要在写代码的时候来控制的,数据库只能是控制你的操作级的并发。
      

  7.   

    to flysharker(飞鲨) :这种情况如何用程序控制,因为二者几乎是同时进行,难道是加事务来控制?
      

  8.   

    lz,你应该去看一下bo里面关于锁的章节,里面还有很好的例子自己动手做一下,不然还是很模糊的第一,怎样的操作(包括update,insert,delete,select)会产生并发现象?难道就是多用户同时update一条记录时产生?如果一个用户在执行insert一条记录,正好另一个同时也同时在执行一个insert操作,我想这不会产生并发,如果这个用户同时执行select * 的操作时,会产生并发吗?是不是所有的select操作都不会引起并发操作吗?>>select 和insert之间会有并发问题,加入你select语句所在的那个事务实串行读的,那么你的insert操作就会被阻塞。因为如果insert不阻塞,那个select所在的那个事务两次select拿到的记录就会不同.第二,对于一个存储过程,就是一个update一条记录的操作,如果两个用户操作执行这个存储过程,前台的程序就会报错,说进程被占什么的.那么,我现在了对了这个update操作了加了事务,进行了回滚,那么第二个操作的人就会回滚,此时前台程序还会提示出错呢?因为我很难能测试出并发操作.>>把你的update贴出来,因为单独一个update是不会报这种错误的,我怀疑是你update之后没有及时提交事务。导致另外一个程序超时了第三,对于Rollbakck Transaction操作,是不是执行到该语句后,它后面的语句还是要继续执行吗?是不是像return那样就停止后面的语句了?>>自己试一下就可以知道的问题不要问这些问题希望得到大家的帮助.