оператор net c # lock на уровне доступа к данным - PullRequest
0 голосов
/ 01 января 2011

Я видел код, где у них есть слой доступа к данным, например:

public class CustomerDA{  

    private static readonly object _sync = new object();  
    private static readonly CustomerDA _mutex = new CustomerDA();  

    private CustomerDA(){  
    }

    public CustomerDA GetInstance(){    

        lock(_sync){      
            return _mutex;        
        }    
    }  

    public DataSet GetCustomers(){  
        //database SELECT
        //return a DataSet
    }  

    public int UpdateCustomer(some parameters){  

        //update some user
    }

}  


public class CustomerBO{  

    public DataSet GetCustomers(){  

        //some bussiness logic  
        return CustomerDA.GetInstance().GetCustomers();
    }
}

Я использовал его, но начинаю думать ... "а что, если бы пришлось создавать приложение, похожее на Facebook, где есть сотни тысяч одновременно работающих пользователей? Я бы запретил каждому пользователю выполнять свои действия до конца предыдущего пользователя его материал базы данных? и для метода Update, полезно ли блокировать нити в приложении, когда движки баз данных уже управляют параллелизмом на уровне сервера баз данных? "

Затем я начал думать о переносе блокировки на методы GetCustomers и UpdateCustomer, но снова подумал: «Это вообще полезно?»

Редактировать 3 января:

все в порядке, я пропустил ключевое слово "static" в методе "GetInstance".

Еще одна вещь: я думал, что ни один поток не сможет получить доступ к переменной _mutex, если в том же классе доступа к данным работает другой поток. Я имею в виду, что я думал, что поскольку переменная _mutex возвращается из оператора блокировки, ни один поток не сможет получить доступ к _mutex до ";" было достигнуто в следующем предложении:

return CustomerDA.GetInstance().GetCustomer();

После некоторого отслеживания я понимаю, что сделал неверное предположение. Не могли бы вы подтвердить, что я сделал неправильное предположение?

Итак ... Могу ли я с уверенностью сказать, что моему уровню доступа к данным не требуется какой-либо оператор блокировки (даже для INSERT, UPDATE, DELETE) и что не имеет значения, являются ли методы в моем DataAccess статическими или методы экземпляра?

Еще раз спасибо ... ваши комментарии так полезны для меня

Ответы [ 2 ]

1 голос
/ 01 января 2011

Блокировка в этом коде совершенно бессмысленна. Он блокируется вокруг кода, который возвращает значение, которое никогда не изменяется, поэтому нет никакой причины иметь блокировку там. Цель блокировки в коде - сделать объект одноэлементным, но поскольку он не использует отложенную инициализацию, блокировка вообще не нужна.

Делать слой доступа к данным одноэлементным - это действительно плохая идея, это означает, что только один поток за раз может получить доступ к базе данных. Это также означает, что методы в классе должны использовать блокировки, чтобы гарантировать, что только один поток одновременно обращается к базе данных, иначе код не будет работать должным образом.

Вместо этого каждый поток должен получить свой собственный экземпляр уровня доступа к данным со своим собственным подключением к базе данных. Таким образом, база данных позаботится о проблемах параллелизма, и theads не будет делать никакой блокировки вообще.

0 голосов
/ 01 января 2011

Установите свой замок там, где он необходим, чтобы там, где происходят параллельные обращения. Поместите в блокировку / критическую секцию столько кода, сколько действительно необходимо.

Что GetInstance не должен быть статическим?

следующий псевдокод объясняет, как работает GetInstance:

  1. ЗАМОК
  2. rval = _mutex
  3. ОТКРЫВАЕТ
  4. Возврат rval

_mutex только для чтения, ссылается на ненулевой объект, поэтому его нельзя изменить, зачем блокировать?

Если ваша база данных обеспечивает управление параллелизмом, но в вашей программе вы создаете два потока, записывающих одинаковые данные в одно и то же время в вашем собственном домене, ожидая данных, как может помочь ваша база данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...