解决方案 »

  1.   

    针对三个表的操作是放到同一个事务里面的吗?你应该是把三个操作放到了不同的事务里了吧  再有可能就是程序哪里有删除,或者是谁删除了 
    想找到问题的话,把那一段日志(SQLServer的事务日志)取出来分析 
      

  2.   

       如何提取出SQLServer的事务日志?
      

  3.   

       如何提取出SQLServer的事务日志?可以试试这个,可以提前日志,不过不保证能提取到出问题那个时候的日志,因为如果服务器做日志备份,这些日志可能被截断了:
    select *
    from fn_dblog(null,null)
    不过,我觉得很有可能使当时事务报错了,但继续往下执行了,最后也提交了,而报错那个语句正是流水表的那个语句。所以,上次你和我说了这个问题,考虑使用 set xact_abort on : 一直以为存储过程会自动实现事务操作,其实不然。存储过程只是提供的事务操作的支持。要实现事务操作,还得自己实现。        基本上方法有两个:      SET XACT_ABORT指定当 Transact-SQL 语句产生运行时错误时,sql server 是否自动回滚当前事务。语法
    SET XACT_ABORT { ON | OFF }注释
           当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行     时 错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。