I'm using a firebird embedded 2.5.0.26074 database via latest ado provider
which contains a simple table
CREATE TABLE INVENTORY (
ID ID NOT NULL /* ID = VARCHAR(36) NOT NULL */,
EXPIRYTIME EXPIRYTIME NOT NULL /* EXPIRYTIME = BIGINT NOT NULL */,
ITEMSIZE ITEMSIZE /* ITEMSIZE = BIGINT NOT NULL */,
ACCESSCOUNT ACCESSCOUNT DEFAULT 1 NOT NULL /* ACCESSCOUNT = INTEGER
DEFAULT 1 NOT NULL */,
LASTACCESSTIME LASTACCESSTIME /* LASTACCESSTIME = TIMESTAMP NOT NULL */
);
To tally the sum of all ITEMSIZE rows two triggers where created on the
INVENTORY table to add or subtract the value in ITEMSIZE to a TOTALSIZE Column
(Single row) in table STATS as a row was added or removed.
CREATE TABLE STATS (
INSTANCE SMALLINT,
SIZE BIGINT DEFAULT 0);
This did not work as deadlock exceptions kept occurring in the triggers.
Someone suggested using a view instead to get the sum of all ITEMSIZE records.
CREATE OR ALTER VIEW SIZEVIEW(ITEMSIZE) AS SELECT
CAST(COALESCE(SUM(inventory.itemsize), 0) AS BIGINT) FROM INVENTORY;
This did not work either. The deadlock errors still occur when using this view
as follows "SELECT * FROM INVENTORY". Lastly I tried different isolation
levels IsolationLevel.ReadCommitted, ReadUncommitted, IsolationLevel.Snapshot
but still not joy.
this is the calling code
public T ExecuteScalarQueryAs<T>(string Query)
{
try
{
FbTransaction Transaction =
DBConnection.BeginTransaction(IsolationLevel.Snapshot);
using (var FBC = new FbCommand(Query, DBConnection,
Transaction))
{
object Value = FBC.ExecuteScalar();
Transaction.Commit();
if (Value != null)
{
return (T)Value;
}
return default(T);
}
}
catch (Exception e)
{
Log.FatalException("Database Execute Scalar Query Exception",
e);
throw;
}
}
Have also tried IsolationLevel.ReadCommitted, ReadUncommitted
How can I read the sum of itemsize while items are being removed & and added
concurrently? It is not critical that this value is 100% correct but I do need
to be able to read it reliably.
Thank you..