
[英]SQL Server detected a logical consistency-based I/O error.torn page It occurred during a read of page
[英]Read consistency on page split
为简单起见,假设我们有一些非叶子页面 A,其中 key 为 int。 我们想要找到键 4812,此时我们有条目 2311 和 5974。因此,当前线程为该页获取一个共享锁存器并计算它需要叶页 B(用于 2311 和 5974 之间的数据)。
同时,其他一些线程正在插入页面 B,之前在其上获取了独占锁存器。 由于插入,它必须在条目 3742 上拆分页面并使用上半部分数据创建新页面 C。
第一个线程已完成读取并释放页面 A 上的锁存器。如果它试图在页面 B 上找到键 4812(在释放独占锁存器后)它不会找到它,因为它在页面拆分期间被移动到页面 C。
如果我理解正确,闩锁是用自旋锁实现的,它应该是短暂的。 为了防止这种问题,写线程必须在所有遍历的非叶子页面上保持闩锁,这将是非常低效的。
我基本上有两个问题:
是仅在页级别上锁存还是也可以在行级别上? 我找不到这方面的信息。 如果是这样的话,那么影响就不会那么大了,但是当没有页面拆分时它仍然是浪费的(大多数情况下都是这样)。
是否有其他机制来解决这个问题?
我的问题是关于 Sql 服务器,因为我熟悉它的内部结构,但这应该适用于大多数其他数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.