How to totally lock a row in Entity Framework

前端 未结 3 453
猫巷女王i
猫巷女王i 2021-02-05 12:10

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.



        
相关标签:
3条回答
  • 2021-02-05 12:51

    you can set the isolationlevel on the transaction in Entity framework to ensure no one else can change it:

    YourDataContext.Database.BeginTransaction(IsolationLevel.RepeatableRead)
    

    RepeatableRead Summary: Locks are placed on all data that is used in a query, preventing other users from updating the data. Prevents non-repeatable reads but phantom rows are still possible.

    0 讨论(0)
  • 2021-02-05 13:06

    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();
        }
    }
    
    0 讨论(0)
  • 2021-02-05 13:10

    The whole point of a transactional database is that the consumer of the data determines how isolated their view of the data should be.

    Irrespective of whether your transaction is serialized someone else can perform a dirty read on the same data that you just changed, but did not commit.

    You should firstly concern yourself with the integrity of your view and then only accept a degredation of the quality of that view to improve system performance where you are sure it is required.

    Wrap everthing in a TransactionScope with Serialized isolation level and you personally cannot really go wrong. Only drop the isolation level when you see it is genuinely required (i.e. when getting things wrong sometimes is OK).

    Someone asks about this here: SQL Server: preventing dirty reads in a stored procedure

    0 讨论(0)
提交回复
热议问题