我用spring定义了两个事务:
事务1:查表a的第一条记录的id;
事务2:根据id做一些操作,然后删除表a的第一条记录。
两个事务在一个for循环中,不断的取表a的第一条记录,直到删除表中的所有记录。
for(){
  事务1;
  事务2;
}但实际运行时出现了这样的情况,第n+1次循环读取了第n次循环中已经删除的id,进行了无效处理。也就是第n次循环中事务2的删除操作还没有commit,n+1次循环中的事务1就进行了查表操作,得到了删除前的数据。之后我将两个事务合并为一个事务3,就不会出现这种情况。
for(){
  事务3;
}请问各位大牛,这里的事务1和事务2之间没有隔离性么?事务2的修改未提交,事务1就可以读取?
为什么合并成事务3后不同循环中的事务3就可以保证串行操作?项目用的是Spring+Struts+hibernate,数据库为oracle

解决方案 »

  1.   

    事务最麻烦的东西,建议你看看SPRING的事务机制,事务隔离级别,去看看~是不是这个没设置
      

  2.   

    假设2个线程 并行thread1 -> start transation1 -> begin -> delete data (id = 1110) 当thread1没有commit的时候, thread2 就开始读取了,所有有问题了。
    thread2 -> start transation2  -> begin -> select data (id = 1110)
    如果你保证transation1和2 完全按照串行顺序执行,肯定不会有问题了。 如下所示。
    start transation1 -> begin -> select or delete -> commit transation1-> start transation2 -> begin -> select or delete -> commit transation2
      

  3.   

    是交给spring管理的吗?spring能很好的管理事物,不会出现你说的那种情况
      

  4.   


    是的啊, 我就郁闷了...用的是spring2.5
      

  5.   

    那就有点怪了,如果是单线程不会这样吧,要不你在线程2后面sleep几秒,试试行不行
      

  6.   

    你的事务是加在service上的吗?
    事务1和事务2是不是分别对应两个service方法?
      

  7.   

    两个事务不在同一个service也没多大关系吧,这两个事务执行是有先后顺序的,又是单线程,会不会事务2没有提交??
      

  8.   

    看了下事务传播属性是PROPAGATION_REQUIRED,隔离级别没有定义,应该是oracle默认的READ COMMITTED
      

  9.   

    你先看下你的Spring定义的传播属性。如果不是每次都新开一个事物的话,你这个仍然不是事务嵌套,虽然是多个方法之间调用,但是却是在同一个事务中。