> >Hello,
> >
> >i m in multi user database.
> >
> >I want to clean a table of all entries from one user (rec with field
> >id_user=xxx)
> >and insert new entries, BUT i must be sure that noone is not actually doing
> >any
> >insert on this table for this user. i can not lock the table because this
> >will
> >affect all the users, i just need to lock all insert with id_user=xxx
> >
> >is this possible in firebird ?
> >
> >at the end yes i will lock the table but if i can avoid it ...
>
> Why do you want to 'partially lock the table', Nathan? It could be possible
> for you to actually allow inserts (from other users) while you do your
> housekeeping, each transaction can simply appear as a steady state. Let's say
> you start your transaction, read what you're interested in, deletes all rows
> for that particular id_user and 'reinsert'. Maybe you worry that between your
> SELECT and DELETE, another user adds one record. That's no problem with
> Firebird, as long as your SELECT and DELETE happen within the same
> transaction (and you use concurrency isolation), inserts from other users
> aren't at all visible - i.e. you can be assured that the DELETE will see
> exactly the same rows as your SELECT and not delete the intermediate insert
> (both the DELETE and SELECT will see changes done within their transaction,
> but not changes done by other, concurrent, transactions).
>
> Maybe there are other reasons for you to want to partially lock the table,
> e.g. if the SELECT and DELETE for some reason has to happen in separate
> transactions. If so, you (or this list) might have to come up with other
> solutions.
>
> HTH,
> Set
>
>Hello,
>
>it's when i want to reset aggregated data.
>
>I have a temp table where i add a row with +1 and -1 as Item_count_Delta
>everytime someone add a new item in the product table.
>
>at the end of the days i calculate the item count of all products by
>aggregating all rows from the temp table
>
>Now time to time i need to reset the calculation for one particular product,
>so i simply launch a query that count all item and set
>the item_count of the product ... but of course during this calculation, no
>one must be able to add (or delete) a new item to the
>product because if yes my calculation will be false ... for this i must forbid
>to add any row in the temp table with item related
>to the product i update
Exactly how will it falsify your calculation? Let's assume two concurrent
transactions, transaction A for your housekeeping and transaction B for adding:
Transaction A (with concurrency isolation) starts.
A:
UPDATE AggregateTable AT
SET AT.MyTotalCount = AT.MyTotalCount+(SELECT SUM(TT.Item_Count_Delta)
FROM TempTable TT
WHERE TT.id_user=AT.id_user)
WHERE AT.id_user='xxx';
Transaction B starts.
B:
INSERT INTO TempTable(id_user, Item_Count_Delta)
VALUES ('xxx', +1);
Transaction B commits.
A:
DELETE FROM TempTable
WHERE id_user = 'xxx';
Transaction A commits.
After this, TempTable will still contain the one record that transaction B
inserted since that record isn't visible to transaction A and hence, wasn't
deleted.
HTH,
Set