Subject RE: [firebird-support] Dirty Read
Author Svein Erling Tysvær
>Hi All
>
>I'm using C# and Firebird Database 2.5 and Firebird Client 2.5.1
>
>I'm trying to read a specific record that is currently being updated but the same record appears to be locked.
>I cant read it. My code just hangs.
>
>This is an example code I've put together:-
>
>FB_Connection AnotherConnection = new FB_Connection(tbDB_Path.Text, Con_DB_Default_DataSource, Con_DB_Default_UserID,
> Con_DB_Default_Password, Con_DB_Default_Port);
> AnotherConnection.Connection.Open();
>
>// Start our Transaction
>FtrUpdate = My_FB_Connection.Connection.BeginTransaction (System.Data.IsolationLevel.ReadUncommitted);
>
>ApplySQL("UPDATE EMPLOYEES_TABLE SET DISPLAY_NAME = 'TOM' WHERE ID = 26", FtrUpdate);
>
>FdaGeneral = new FbDataAdapter("Select * from EMPLOYEES_TABLE WHERE ID = 26", AnotherConnection.Connection);
>FdaGeneral.Fill(FdsGeneral); MessageBox.Show(FdsGeneral.Tables[0].Rows.Count.ToString();
>
>It doesn't matter what type of isolation level I use the specific record seems locked.
>
>I've used Delphi in the past and had no problems.
>
>I'm not even explicitly locking the record when updating.
>
>Any Ideas?

Firebird is not a 'dirty' database and there's no way to update any uncommitted record. Neither is it possible for any other transaction to read changes you've done in your transaction before your transaction commits (so ReadUncommitted does not exist in Firebird). Firebird is not even a database that locks records. Rather, Firebird uses a versioning system, and each record can exist in one or more versions.

The reason you cannot UPDATE anything, is because another transaction has modified (or deleted or inserted) the record, but not committed yet. Until that transaction commits or rolls back, no other transaction will be able to modify that record (it will be possible to read earlier versions, just not update or delete the record).

So, Firebird does not support dirty reads/updates, but the versioning system makes it so that the only lock conflicts you can get is when two writers tries to update the same record (readers never block anyone and writers never block readers). Your SELECT * FROM EMPLOYEES_TABLE
ought not to fail, but it will return old values at least until FtrUpdate commits (note, I know nothing about C#).

HTH,
Set