ADO.NET锁定对象

时间:2016-06-27 20:33:52

标签: c# sql-server transactions ado.net locking

我有以下代码......

    private DbTransaction Transaction;

    private readonly object TargetObject = new object();

    public CustomDataReader GetDataReader(CustomCommand command)
    {
        DbDataReader reader = null;        

        lock (TargetObject) // what is the purpose of this lock?
        {                                   
            DbCommand cmd = ProviderFactory.CreateCommand();
            cmdConnection = Connection;
            cmd.CommandText = command.Script;
            cmd.Transaction = Transaction;

            foreach (CommandParameter param in command.Parameters)
            {
                cmd.Parameters.Add(Parse(param));
            }

            OpenConnection();

            if (Transaction == null)
            {              
                reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            else
            {
                reader = cmd.ExecuteReader();
            }  
        }

        return new CustomDataReader(reader);
    }

我想了解lock(TargetObject)的目的是什么?当我们在执行命令时使用事务时,为什么要使用该锁机制?

1 个答案:

答案 0 :(得分:1)

这意味着在多线程环境中,锁定部分内的代码段一次只能在一个线程中执行。这与事务不同,这意味着对数据库的所有更改都会失败或一起成功。

来自MSDN

  

lock关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分。