代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

获取锁-C#SQL server

  •  1
  • Navaneeth K N  · 技术社区  · 14 年前

    数据库:SQL server 2005

    我有一个方法可以处理 User 传递给它的对象。我想控制当多个线程使用同一用户对象调用该方法时该方法的工作方式。我实现了一个利用数据库的简单锁定。我不能用C lock

    下面的代码显示了我所拥有的(异常处理(为清楚起见省略)

    如:

    void Process(User user)
    {
        using(var transaction = BeginTransaction())
        {
            if(LockUser()) {
                try {               
                    /* Other processing code */
                }
                finally {
                    UnLockUser();
                }
            }
        }
    }
    

    LockUser() false UnlockUser

    注意:请不要考虑锁无法正确删除的可能性。我们有一个SQL作业,用于清除长时间锁定的项。

    假设两个线程同时执行此方法,并且它们都启动了事务。由于事务仅在所有处理逻辑之后提交,因此在thread2上启动的事务是否会看到thread1插入到锁表中的数据?

    这个锁定逻辑行吗?你认为这种方法有什么问题吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Manfred    14 年前

    如果锁的获取(通过在数据库表中插入一个条目)是同一事务的一部分,那么第二个线程将看到该事务的所有更改或没有更改。对于默认隔离级别(ReadCommitted),这是正确的。

    换句话说:无论哪个线程成功地提交了单个事务,它也成功地获得了锁(=成功地将条目插入数据库)。

    在您的代码示例中,我缺少对Commit()/Rollback()的处理。确保将此作为实现的一部分。

        2
  •  0
  •   Frederik Gheysels    14 年前

    它取决于您使用的事务隔离级别。 默认隔离(ReadCommitted)级别确保其他连接无法看到连接正在进行的未提交的更改。

    在执行SQL语句时,可以使用 locking hints .