none
个部署在IIS中的网站,随着用户提交信息的次数变多,每次提交需要修改3张表(数据库),总有一次提交只修改1张表,请问这是为什么? RRS feed

  • 问题

  • 每次用户提交的信息,转换为SQL语句后,我都用事务处理过.提交给SQL Server 2000.

    提交了1000次信息后,总有一次出现错误(就是只修改一张表).

    这是我的Sql语句.

    begin tran  UPDATE Booking_class SET B_10 = B_10 + 1, P_10 = P_10 + '朱国强测;', B_morning = B_morning + 1 WHERE(coach_no = '9107010844') AND (bdate = '2010-09-09');  UPDATE Booking_vehicle SET B_10 = 1, P_10 = '朱国强测/张劲波' WHERE(License_plate = '沪D0908学') AND (BDate = '2010-09-09');  INSERT INTO Booking(pupil_id, pupil_no, name, reg_card_type, card_no, tel, coach_no, bdate, timeline_name, vehicle_type_code, license_plate, subject_now, b_pay, submit_date, vehicle_kind_code, Is_vip, class_id, begin_time, area, last_user,Train_unit_Code_JX,Train_unit_Code_JX_Swap)VALUES('15166f6d-f65e-4f65-8cab-c2dabe23f3c1', 'AR08092003', '朱国强测', 'A', '310108198102011888', '119', '9107010844', '2010-09-09', 'B_10', 'C2', '沪D0908学', '3', '100', '2010-09-08 14:28:17', 'CB', 0, 10, '0900', '场内','朱国强测','R0300-00','R0300-00');  INSERT INTO NewInOut (pupil_no, pupil_name, bdate, begin_time, license_plate, COACH_NO, coach_name, alone,Train_unit_Code_JX,Train_unit_Code_JX_Swap)VALUES ('AR08092003', '朱国强测', '2010-09-09', '0900', '沪D0908学', '9107010844', '张劲波', 0,'R0300-00','R0300-00');  if @@error>0 rollback tran else commit tran;

    这是我的Sql语句,每个Sql语句之间用分号隔开.

    请各位大哥大姐帮帮忙.

    2010年9月21日 8:08

答案

  • 对,要加上判断处理

     

    if @@error>0

    begin

    rollback

    return

    end

     

    在2005以及以后版本中可以使用try catch,只需要一次判断就可以了


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年9月26日 5:22
    版主

全部回复

  • Trace it in profiler to get details.
    2010年9月21日 13:04
  • 是否因为产生error导致数据回滚。

    尝试用logparser分析IIS日志是否存在错误记录,类似如logparser "SELECT * FROM ex*.log" –i:IISW3C

    2010年9月22日 9:41
  • Should rollback whole transaction if there's error. Any table has trigger in it?
    2010年9月22日 13:02
  • 楼主sql的错误处理存在问题.

    if @@error>0 rollback tran else commit tran;

    语句中存在多个更新语句,但只有一处错误判断.

    例如

    update..

    update..

    update..

    select @@error 

    假设第一个update执行错误,后两个执行成功, 最后的select @@error返回0.

    所以在如果想要让一个大的事物全部提交或者全部回回滚,需要在每个更新/删除/插入语句后进行错误判断,如果出错就回滚并跳出事物,否则继续.


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年9月24日 7:12
    版主
  • 楼主sql的错误处理存在问题.

    if @@error>0 rollback tran else commit tran;

    语句中存在多个更新语句,但只有一处错误判断.

    例如

    update..

    update..

    update..

    select @@error 

    假设第一个update执行错误,后两个执行成功, 最后的select @@error返回0.

    所以在如果想要让一个大的事物全部提交或者全部回回滚,需要在每个更新/删除/插入语句后进行错误判断,如果出错就回滚并跳出事物,否则继续.


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com


    请问,是不是在每句Sql语句的后面,都加上    if @@error>0 rollback tran;

    是这个意思吧.

    2010年9月26日 2:47
  • 对,要加上判断处理

     

    if @@error>0

    begin

    rollback

    return

    end

     

    在2005以及以后版本中可以使用try catch,只需要一次判断就可以了


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年9月26日 5:22
    版主