MS SQL Server 7.0 Record Lock的問題… |
答題得分者是:Mickey
|
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
|
neoart
版主 發表:22 回覆:582 積分:425 註冊:2003-05-09 發送簡訊給我 |
很抱歉我對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 發送簡訊給我 |
曾經做了個 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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |