二個Thread如何避免Lock(SQLite) |
缺席
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,各位先進大家好:
因程式使用二個Thread處理資料 二Thread均會對SQLite進行存取, 因而會造成DB Lock, 請教,該如何解決? 謝謝! function InsertSynced(FileName: String; Size: Int64; MydifyDate: String; Status: String): Boolean; var dbxConn: TDBXConnection; dbxCommand: TDBXCommand; dbxTransaction: TDBXTransaction; begin Result := True; try try SQLConnection1.Connected := True; dbxConn := SQLConnection1.DBXConnection; dbxCommand := dbxConn.CreateCommand; dbxTransaction := dbxConn.BeginTransaction(1); dbxCommand.Text := Format('INSERT OR REPLACE INTO Synced(FileName, Size, ModifyDate, Status) VALUES ("%s", %d, "%s", "%s")', [FileName, Size, MydifyDate, Status]); dbxCommand.ExecuteQuery; except Result := False; end; finally dbxConn.CommitFreeAndNil(dbxTransaction); FreeAndNil (dbxCommand); SQLConnection1.Connected := False; end; end; |
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
已解:
方法一:增一Global變數 gLock,自行設定及判斷目前是否已有程序在處理資料庫,缺點是到這裡變成單工 方法二:改用FireDAC,可以使用Share mode 謝謝! ===================引 用 blue 文 章=================== Hi,各位先進大家好: 因程式使用二個Thread處理資料 二Thread均會對SQLite進行存取, 因而會造成DB Lock, 請教,該如何解決? 謝謝! function InsertSynced(FileName: String; Size: Int64; MydifyDate: String; Status: String): Boolean; var dbxConn: TDBXConnection; dbxCommand: TDBXCommand; dbxTransaction: TDBXTransaction; begin Result := True; try try SQLConnection1.Connected := True; dbxConn := SQLConnection1.DBXConnection; dbxCommand := dbxConn.CreateCommand; dbxTransaction := dbxConn.BeginTransaction(1); dbxCommand.Text := Format('INSERT OR REPLACE INTO Synced(FileName, Size, ModifyDate, Status) VALUES ("%s", %d, "%s", "%s")', [FileName, Size, MydifyDate, Status]); dbxCommand.ExecuteQuery; except Result := False; end; finally dbxConn.CommitFreeAndNil(dbxTransaction); FreeAndNil (dbxCommand); SQLConnection1.Connected := False; end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |