Transação com dbExpress
Utilizamos Delphi 7 + dbExpress + Firebird 1.5. Gostaria de saber qual o momento exato que se deve colocar um dataSet em Transação...
Se no momento que é dado um insert (Ex. SimpleDataSet1.Insert) já pega a transação depois dá um post + ApplyUpdates + Commit ou conforme o código abaixo seria mais conveniente, ou seja, depois que realizar o post no dataset:
.....
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
if not SQLConnectionX.InTransaction then
begin
TD.IsolationLevel := xilREADCOMMITTED;
TD.TransactionID := 1;
SQLConnectionX.StartTransaction(TD);
try
SimpleDataSet1.ApplyUpdates(0);
SQLConnectionX.Commit(TD);
except
on E: Exception do
begin
SQLConnectionX.Rollback(TD);
raise Exception.Create(E.Message);
end;
end;
end;
Obs: Existe algum limite de transações que podem estar em abertas ao mesmo tempo (Ex. 20 estações de trabalho com 20 transações ao mesmo tempo). Se tiver muitas transações em abertas a performance do banco poderá diminuir ?
Se no momento que é dado um insert (Ex. SimpleDataSet1.Insert) já pega a transação depois dá um post + ApplyUpdates + Commit ou conforme o código abaixo seria mais conveniente, ou seja, depois que realizar o post no dataset:
.....
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
if not SQLConnectionX.InTransaction then
begin
TD.IsolationLevel := xilREADCOMMITTED;
TD.TransactionID := 1;
SQLConnectionX.StartTransaction(TD);
try
SimpleDataSet1.ApplyUpdates(0);
SQLConnectionX.Commit(TD);
except
on E: Exception do
begin
SQLConnectionX.Rollback(TD);
raise Exception.Create(E.Message);
end;
end;
end;
Obs: Existe algum limite de transações que podem estar em abertas ao mesmo tempo (Ex. 20 estações de trabalho com 20 transações ao mesmo tempo). Se tiver muitas transações em abertas a performance do banco poderá diminuir ?
Mcd
Curtidas 0
Respostas
Mcd
16/02/2006
[i:65ec2c423f].....
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
if not SQLConnectionX.InTransaction then
begin [/i:65ec2c423f]
No codigo anterior faltou mais o post
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
[b:65ec2c423f]SimpleDataSet1.Post; [/b:65ec2c423f]
if not SQLConnectionX.InTransaction then
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
if not SQLConnectionX.InTransaction then
begin [/i:65ec2c423f]
No codigo anterior faltou mais o post
SimpleDataSet1.Insert;
SimpleDataSet1.FieldByName(´Codigo´) .AsInteger:= 1;
SimpleDataSet1.FieldByName(´nome´) .AsString:= ´Teste´;
[b:65ec2c423f]SimpleDataSet1.Post; [/b:65ec2c423f]
if not SQLConnectionX.InTransaction then
GOSTEI 0
Caduengenheiro
16/02/2006
quer evitar deadlock? utilize...
TD.IsolationLevel := xilCUSTOM;
TD.IsolationLevel := xilCUSTOM;
GOSTEI 0
Mcd
16/02/2006
[b:19c5603e9a]if not SQLConnectionX.InTransaction then
begin
TD.IsolationLevel := xilREADCOMMITTED;
TD.TransactionID := 1;
SQLConnectionX.StartTransaction(TD);
try
....[/b:19c5603e9a]
Alguem sabe quais os recursos que o banco de dados aloca no momento que eu pego uma nova transação, assim como o codigo acima ?
begin
TD.IsolationLevel := xilREADCOMMITTED;
TD.TransactionID := 1;
SQLConnectionX.StartTransaction(TD);
try
....[/b:19c5603e9a]
Alguem sabe quais os recursos que o banco de dados aloca no momento que eu pego uma nova transação, assim como o codigo acima ?
GOSTEI 0