2011-02-16 129 views
2

我有几个线程执行一些带有可序列化隔离级别的SQL select查询。我不确定要选择哪种实施方式。这:可序列化的隔离级别原子性

_repository.Select(...) 

或本

lock (_lockObject) 
{ 
    _repository.Select(...); 
} 

换句话说,是有可能的几个交易将开始在同一时间,并选择操作范围内部分块记录执行。

P. S.我正在使用MySQL,但我想这是一个更普遍的问题。

回答

3

交易执行SELECT查询放置在排共享锁,从而允许其它事务读取那些行中,但防止它们使得对行的变化(包括插入新记录到间隙)

锁定在应用程序做别的东西,它不会允许其他线程输入代码块从库中提取数据,这种做法可能会导致非常糟糕的表现有以下几个原因:

  1. 如果任何行被另一个事务(应用程序外)通过排他锁锁定,则应用程序中的锁定将无济于事。
  2. 即使在没有以独占模式锁定(未更新)的行上,多个事务也不能执行读取操作。
  3. 在所有数据被提取并返回给客户端之前,锁不会被释放。这包括网络延迟以及将MySql结果集转换为代码对象所需的任何其他开销。
  4. 最重要的是,执行数据完整性&原子性是数据库的工作,它知道如何处理它,以及如何检测潜在的死锁。何时执行记录锁定以及何时添加索引间隙锁定。它是什么数据库是和MySQL是ACID投诉,并被证明处理这些情况

我建议你通过MySQL文档的Section 13.2.8. The InnoDB Transaction Model and Locking阅读,它会给你一个很大的启示是如何在InnoDB中锁定执行。