How to totally lock a row in Entity Framework

Zapnologica picture Zapnologica · Nov 18, 2014 · Viewed 21.1k times · Source

I am working with a situation where we are dealing with money transactions.

For example, I have a table of users wallets, with their balance in that row.

UserId; Wallet Id; Balance

Now in our website and web services, every time a certain transaction happens, we need to:

  1. check that there is enough funds available to perform that transaction:
  2. deduct the costs of the transaction from the balance.

How and what is the correct way to go about locking that row / entity for the entire duration of my transaction?

From what I have read there are some solutions where EF marks an entity and then compares that mark when it saves it back to the DB, however what does it do when another user / program has already edited the amount?

Can I achieve this with EF? If not what other options do I have?

Would calling a stored procedure possibly allow for me to lock the row properly so that no one else can access that row in the SQL Server whilst program A has the lock on it?

Answer

Max Brodin picture Max Brodin · Nov 18, 2014

EF doesn't have built-in locking mechanism, you probably would need to use raw query like

using (var scope = new TransactionScope(...))
{
    using (var context = new YourContext(...))
    {
        var wallet = 
            context.ExecuteStoreQuery<UserWallet>("SELECT UserId, WalletId, Balance FROM UserWallets WITH (UPDLOCK) WHERE ...");

        // your logic

        scope.Complete();
    }
}