开启一个JAVA事务,第一个SQL语句数据量少,做了查询后并写进文件,再把数据UPDATE后,导入到另一个表(完成)。现在第二个SQL语句是查询另一个表,大概有150万条记录,然后把这记下写进另一文件中,再把数据UPDATE后,导入到另一个表。这些都在一个事务里面。但现在在第二个SQL语句执行时。由于量比较大。可能会等很长时间,但WEB界面出现SESSION失效了。操作员就重新登录了。现在出现问题是没有把第一个SQL语句的相关操作回滚。有没有人碰到JAVA的这种情况。现在发现,第一个SQL语句的数据文件生成了。而且也移到另一个表了。为何不回滚呢,谁能解释一下嘛,我估计是停在第二条SQL查询语句上。请高手帮忙解释一下。有什么别的好办法解决嘛。

解决方案 »

  1.   

    1.之所以没有回滚,估计是你的事务执行过程中,没有实时的session check,所以session失效,并没有产生异常或者退出事务。其实,我觉得正确的处理方式应该是:事务执行过程中,刷新session,使之保持有效。
    2.肯定要提高 第二条SQL查询的效率,
    3.如果事务出错,是否有文件删除的处理?? 我觉得如果回滚,文件也要删除。
      

  2.   

    执行SQL语句,边执行边判断session是否为空,这样子就可以啦~~
      

  3.   

    那请问一下,session失效的话,那他后台的事务执行应该继续执行。而不应该出现没有异常也没有往下一步走的情况?或者出现锁表的情况吧,至少JDBC返回一个查询连接超时的异常吧。可为何什么也没有?JAVA的事务不是非常清楚,看来得好好研究一下。另session检查是在前台页面检查,然后自动刷新。
      

  4.   

    session 超时应该不会影响sql语句的执行吧 如果事务不超时 没有异常抛出 个人 认为 语句还是会正常执行的。不知道你的语句要执行多久哪 几十秒都执行不完吗 如果是 建议优化SQL语句 要不会对数据库造成很大的压力。 如果大家一起点 数据库down掉也是有可能的。
    还有是否有可能从业务上分解一下 比如把 写库和写文件 分开来做 毕竟事务只对写库有用 对文件是回滚不了得 建议数据库操作成功后 再来写文件。事务是为了保证数据库内数据的一致性,因为数据库是关系型的 数据是相互关联 影响的 事务时很必要的,文件应该是独立的 没有这么高的要求把。 
      

  5.   

    得视具体情况而定吧,
    比如,我用flex调用一个后台的service,如果涉及到数据库操作必然在事务中进行,
    如果此时,session过期,页面跳转,即便原来service执行正常,可是找不到正常处理的后续操作,也就无法走到下一步。锁表,要么手动锁,要么发生表更新,但是事务回滚/提交后,就不会锁表了,除非2个事务发生死锁,可以看看这篇文章http://baike.baidu.com/view/121723.htm
      

  6.   

    理论上,就算前台session失效了,后台的事务应该会执行完的。要不回滚,要不异常。这个数据量比较大。现在是找一下原因,看有没有别的方法解决和找原因。那个SQL语句不是很复杂的。所以优化提高不了。不知道有没有人碰到过。