可序列化的隔离级别原子性

时间:2011-02-16 06:31:04

标签: sql mysql relational-database

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

_repository.Select(...)

或者

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

换句话说,是否有可能同时开始执行多个事务并部分阻止选择操作范围内的记录。

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

1 个答案:

答案 0 :(得分:3)

执行SELECT次查询的事务会在行上放置共享锁,允许其他事务读取这些行,但阻止它们对行进行更改(包括将新记录插入到行中)间隙)

锁定应用程序正在做其他事情,它不允许其他线程进入代码块从存储库中获取数据,这种方法可能会导致性能非常差,原因有几个:

  1. 如果任何行被另一个事务(在应用程序之外)通过独占锁锁定,则应用程序中的锁将无济于事。
  2. 即使在未以独占模式锁定(未更新)的行上,多个事务也无法执行读取。
  3. 在获取所有数据并将其返回给客户端之前,不会释放锁定。这包括网络延迟以及将MySql结果集转换为代码对象所需的任何其他开销。
  4. 最重要的是,实施数据完整性&原子性是数据库的工作,它知道如何处理它,如何检测潜在的死锁。何时执行记录锁定,以及何时添加索引间隙锁定。这是数据库的用途,MySql是ACID投诉,并且已经证明可以处理这些情况
  5. 我建议您阅读MySql文档的Section 13.2.8. The InnoDB Transaction Model and Locking,它将为您提供有关如何执行InnoDB锁定的深刻见解。