線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1351
推到 Plurk!
推到 Facebook!

MS SQL Server 7.0 Record Lock的問題…

答題得分者是:Mickey
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-07 14:42:03 IP:211.21.xxx.xxx 未訂閱
各位前輩: 開發環境如下: 資料庫:MS SQL Server 7.0 開發工具:Delphi5 連線方式:ADO Tow-Tier架構 要如何做才能達到Record Lock?也就是不同的Client不能針對同一筆Record作Edit…敬請指教…感激不盡…
------
~小弟淺見,參考看看~
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-17 10:07:32 IP:61.64.xxx.xxx 未訂閱
很抱歉我對delphi不了解.不過就java而言,有類似對於database read&write同步性的設定: databaseConn.setTransactionIsolation(java.sql.Connection.TRANSACTION_SERIALIZABLE); 參考以下的技術文件: http://www2.tw.ibm.com/developerWorks/tutorial/content/java/t20031222.html 其中的交易層級的片段 及以下案例: http://www.javaworld.com.tw/jute/post/view?bid=7&id=18935&sty=1&tpg=1&age=0 在三層式架構中,是建議把這樣的一個處理單元獨立出來.同步化兼單一化窗口就應該不是問題了.
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-18 11:33:23 IP:218.170.xxx.xxx 未訂閱
曾經做了個 Function ( For BDE; DBMS=Oracle/MSSQL/Sybase ), 參考看看.    
function LockBDEDataSet(DS : TQuery):boolean;
var fsql,DBType,fTableName,fHostName: string;
    t:hDBICur;
    r:DBIResult;
    OldInTran : Boolean;
begin
  if not DS.Active then raise Exception.CreateFmt('DataSet %s is not actived.',[DS.Name]);
  DBType := DS.Database.Session.GetAliasDriverName(DS.Database.AliasName);
  fTableName := GetTableNamefromSQL(DS.SQL.Text);
  if CompareText(DBType,'Oracle')=0 then
    fsql := DS.SQL.Text ' for update nowait'
  else if CompareText(DBType,'MSSQL')=0 then
    fsql := StringReplace(DS.SQL.Text,fTableName,fTableName ' with (HOLDLOCK)',[rfReplaceAll, rfIgnoreCase])
  else if CompareText(DBType,'SYBASE')=0 then
    fsql := StringReplace(DS.SQL.Text,fTableName,fTableName ' HOLDLOCK',[rfReplaceAll, rfIgnoreCase])
  else raise Exception.CreateFmt('Unsupported DBMS %s.',[DBType]);
  OldInTran := DS.Database.InTransaction;
  if not DS.Database.InTransaction then DS.Database.StartTransaction;      r := DbiQExecDirect(DS.Database.Handle,qrylangSQL,PChar(fsql),@t);      if CompareText(DBType,'Oracle')=0 then
    fsql := 'select S.TERMINAL from SYS.GV_$LOCKED_OBJECT L,ALL_OBJECTS O,SYS.GV_$SESSION S ' 
            'where L.SESSION_ID=S.SID and S.AUDSID<>USERENV('#39'SESSIONID'#39') and ' 
            'L.ORACLE_USERNAME=USER and O.OWNER=USER and O.OBJECT_ID=L.OBJECT_ID and ' 
            'S.SID=L.SESSION_ID and O.OBJECT_NAME='#39 fTableName #39
  else if (CompareText(DBType,'MSSQL')=0)or(CompareText(DBType,'SYBASE')=0) then
    fsql := 'select p.hostname from master.dbo.syslocks l,master.dbo.sysprocesses p ' 
            'where l.spid=p.spid and l.spid<>@@spid and object_name(l.id)='#39 fTableName #39
  else raise Exception.CreateFmt('Unsupported DBMS %s.',[DBType]);      with TQuery.Create(nil) do begin
    try
      DataBaseName := DS.DatabaseName;
      SQL.Text := fsql;
      Open;
      if not (Eof and Bof) then begin
        if Trim(Fields[0].asstring)='' then fHostName:='Unknown'
        else fHostName := Fields[0].asstring;
        if (Integer(t)=0)or(r<>DBIERR_NONE) then begin
          if not OldInTran then DS.Database.Rollback;
          raise Exception.CreateFmt('鎖定資料失敗. 資料檔 %s 已被 %s 鎖定中.',[fTableName,fHostName]);
        end;
        Application.MessageBox(PChar(Format('資料檔 %s 可能已被 %s 鎖定.',[fTableName,fHostName])),'警告');
      end;
    finally
      Free;
    end;
  end;
  Result := True;
end;
系統時間:2024-10-02 8:43:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!