去年发过一贴,现在发现还有问题
http://topic.csdn.net/u/20100622/10/e05eb65b-9958-4069-ae42-2f2e086cf689.html
比如流水号表
001
002
003获取新流水号 select max(ls_h) from lsh
然后插入新流水号到 lsh如果用户1,用户2 同时操作的话 流水号 就会重复这是事务:
procedure TForm1.Button4Click(Sender: TObject);
var
  ls_h:string;
begin
  ADOConnection1.Connected := true;
ADOConnection1.LoginPrompt := false;
  ADOQuery1.close;  ADOQuery1.Connection.BeginTrans;
  try
    ADOQuery1.sql.clear;
   ADOQuery1.sql.add('Select max(ls_h) from lsh');
   ADOQuery1.open;
   ls_h:=ADOQuery1.Fields[0].AsString;ls_h:=FormatFloat('000',StrToFloat(ls_h)+1);    ADOQuery1.sql.clear;
   ADOQuery1.sql.add(' insert into   lsh(ls_h) values ('''+ls_h+''')  ');
  ADOQuery1.ExecSql;  ADOQuery1.Connection.CommitTrans;
  except
     on e:exception do
    begin
  ADOQuery1.Connection.RollbackTrans;
    Application.MessageBox(PChar(e.message),'执行事务失败,请重试!',MB_OK+MB_IconQuestion);
    end;
  end;
   ADOQuery1.close;
end;我通过两个同样程序的按钮到时执行命令,发现还会重复
procedure TForm1.Button5Click(Sender: TObject);
var
  nowStr,str:string;
begin
while 1 = 1 do
begin
 nowStr:=FormatDateTime('yyyy-mm-dd hh:nn:sss',now);
 if nowStr>='2011-06-07 09:38:40'  then
 begin
  Break;
 end;
end;
Button4.Click;
end;事务不起作用,数据库还是 插入了 两个004

解决方案 »

  1.   

    sql server:
    select * from t1(with UPDLOCK)WITH ( <table_hint> )
    指定查詢最佳化工具必須搭配這份資料表,並針對這個陳述式來使用最佳化或鎖定策略。如需詳細資訊,請參閱<資料表提示 (Transact-SQL)>。在 SQL Server 2005 中,除了部份例外狀況,只有在利用 WITH 關鍵字來指定提示時,FROM 子句才支援資料表提示。另外,還必須利用括號來指定資料表提示。 
    以下是允許和不允許使用 WITH 關鍵字的資料表提示:NOLOCK、READUNCOMMITTED、UPDLOCK、REPEATABLEREAD、SERIALIZABLE、READCOMMITTED、FASTFIRSTROW、TABLOCK、TABLOCKX、PAGLOCK、ROWLOCK、NOWAIT、READPAST、XLOCK 及 NOEXPAND。如果是利用不含 WITH 關鍵字的方式指定這些資料表提示,則必須單獨指定提示。例如:FROM t (fastfirstrow)。
    如果是利用含有其他選項的方式指定提示 (例如:在 (fastfirstrow, index(myindex) 中),則必須利用含有 WITH 關鍵字的方式指定提示,例如: 
    FROM t WITH (fastfirstrow, index(myindex)).
    如果資料庫的相容性層級為 80 或更早,提示就不一定要使用 WITH 關鍵字
    oracle:
    select * from t1 for update [nowait]
      

  2.   

    事务,说简单点,就是把一系列单独的操作,归为一个逻辑上的整体操作。
    如两张表,一张表中的某个字段减一时,要将另一张表中的相应字段加一. 当上面操作仅进行一半时就导致数据出错(第一张表减了,第二张表却没加),这时,事务处理也是一个解决办法,用了事务处理后,上述操作要么全部执行,要么全部不执行
    事务一般用在批处理的过程中SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除  
    SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
      

  3.   

    ADOQuery1的ltPessimistic  等于  WITH (TABLOCKX) 吗?
      

  4.   

    access是桌面型数据库,单机用,没必要加锁
      

  5.   

    那在adoquery设置怎么 达到 WITH (TABLOCKX)的效果呢?ADOConnection的isolationLevel为ilSerializable 
    ADOQuery的LockType=ltPessimistic 这样吗?