可串行化隔离级别原子性

发布于 2024-10-17 21:32:15 字数 288 浏览 5 评论 0原文

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

_repository.Select(...)

或 this

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

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

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

I have several threads executing some SQL select queries with serializable isolation level. I am not sure which implementation to choose. This:

_repository.Select(...)

or this

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

In other words, is it possible several transactions will start executing at the same time and partially block records inside Select operation range.

P. S. I am using MySQL but I guess it is a more general question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挖个坑埋了你 2024-10-24 21:32:15

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

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

  1. 如果任何行被另一个事务(应用程序外部)通过排他锁锁定,则应用程序中的锁将无济于事。
  2. 即使对于未以独占模式锁定(未更新)的行,多个事务也将无法执行读取。
  3. 直到所有数据都取完并返回给客户端后才会释放锁。这包括网络延迟以及将 MySql 结果集转换为代码对象所需的任何其他开销。
  4. 最重要的是,加强数据完整性和安全性。原子性是数据库的工作,它知道如何很好地处理它,如何检测潜在的死锁。何时执行记录锁,何时添加索引间隙锁。这就是数据库的用途,而 MySql 是 ACID 投诉,并且被证明可以处理

我建议的 这些情况您通读了第 13.2.8 节。 MySql 文档的 InnoDB 事务模型和锁定,它将让您深入了解 InnoDB 中的锁定是如何执行的。

Transactions performing SELECT queries place a shared lock on the rows, permitting other transactions to read those rows, but preventing them from making changes to the rows (including inserting new records into the gaps)

Locking in the application is doing something else, it will not allow other threads to enter the code block which fetches the data from the repository, This approach can lead to very bad performance for a few reasons:

  1. If any of the rows are locked by another transaction (outside the application) via a exclusive lock, the lock in the application will not help.
  2. Multiple transactions will not be able to perform reads even on rows that are not locked in exclusive mode (not being updated).
  3. The lock will not be released until all the data is fetched and returned to the client. This includes the network latency and any other overhead that it takes converting the MySql result set to a code object.
  4. Most importantly, Enforcing data integrity & atomicity is the databases job, it knows how to handle it very well, how to detect potential deadlocks. When to perform record locks, and when to add Index gap locks. It is what databases are for, and MySql is ACID complaint and is proven to handle these situations

I suggest you read through Section 13.2.8. The InnoDB Transaction Model and Locking of the MySql docs, it will give you a great insight how locking in InnoDB is performed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文