我有一系列 SQL 语句,如下所示:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Run Code Online (Sandbox Code Playgroud)
我想防止在重新计算计数器值时读取计数器,但根据 Postgres 文档“行级锁不影响数据查询;它们只阻止写入者到同一行。”
问题:
我有一个长时间运行的事务(称为 T1),它对 SQL Server 2008 R2 中的表执行一些删除、更新和插入操作。同时,另一个进程会定期从该表中运行 select 语句。
在默认隔离设置下(我认为是 READ COMMITTED?),T1 会阻止任何 select 语句运行,直到事务提交或回滚。
我希望看到的是,即使在事务正在进行时,select 语句也能对一致的数据起作用。我相信 SNAPSHOT 隔离可以提供帮助,但不确定我是否朝着正确的方向前进。这是该应用程序的最佳隔离级别吗?
其次,我无法控制调用 select 语句的进程,但我可以控制调用 T1 的 .NET 应用程序。select 语句和 T1 都需要更改任何隔离级别,还是仅将 T1 标记为具有不同的隔离级别就足够了?
您能否为中级到高级 SQL 专业人员推荐任何好的资源,以对这些资源进行彻底的研究,如果正确学习,可以更好地导航该领域的所有固有缺陷?
我正在考虑各种资源——教程、博客、手册页、PASS 会话或任何东西。
我LCK_M_S在使用 RCSI时看到等待共享锁 ( )。我的理解是这不应该发生,因为SELECTs在使用 RCSI 时不需要共享锁。
我怎样才能看到共享锁?是因为外键吗?
我的任务是识别生产服务器上发生的任何阻塞。我实现这一目标的计划是使用
EXECUTE sp_configure 'blocked process threshold', 5
Run Code Online (Sandbox Code Playgroud)
结合服务器端跟踪来收集阻塞进程报告。
我知道这项活动会影响性能,我想找到某种方法来量化这将是什么。
我知道共识似乎是大约 75% 的 ram 应该专用于缓冲池。但是,我对缓冲池实例的最佳数量更感兴趣。确定设置时需要考虑哪些事项?
例如,假设我有一个 75GB 的缓冲池。我应该只分配 75 个 1GB 的缓冲池实例吗?15 个,每个 5GB?或者,每个 7.5GB 的 10 个?
我应该从单个缓冲池开始并根据我是否看到锁定来增加吗?
最大实例数应该基于什么 - 可用内核?
谢谢 - 非常感谢您的回复。
所述的PostgreSQL 9.4文档指出添加NOWAIT选项将SELECT FOR UPDATE当行不能被锁定时产生一个错误的装置:
要防止操作等待其他事务提交,请使用 NOWAIT 选项。使用 NOWAIT,如果无法立即锁定所选行,该语句将报告错误,而不是等待。
那究竟是什么错误?
由于这是一个可接受的条件,我希望我的 Java 代码检查此类预期错误,然后解决它。
编辑:为什么会话报告被阻止但等待PAGELATCH_*,而不是LCK_M_相关的等待类型?
我之前假设 SQL Server 只会在 blocks_session_Id 列中报告阻塞会话。如果被阻塞的会话正在等待逻辑锁而不是其他任何东西,例如PAGELATCH_*.
早上/下午/晚上好。
我试图在有几百万行的表中添加一列。这是完整的查询:
alter table date_tasks_mark add column noDuplicate int unsigned not null default 0
Run Code Online (Sandbox Code Playgroud)
不过好像卡住了。
| 28893 | root | localhost | database_name | Query | 10668 | Waiting for table metadata lock | alter table date_tasks_marks add column noDuplicate int unsigned not null default 0
Run Code Online (Sandbox Code Playgroud)
终止查询对我来说安全还是会破坏我的表(它已经处于这种状态大约半小时)?
整个表UPDATE(不指定WHERE子句)是否锁定了 PostgreSQL 中的一个表?例如,它会阻止行被删除/插入吗?
例如,如果我运行,我
UPDATE t1 SET key = 'value'
可以期望t1在UPDATE执行过程中不会插入新行吗?
如果不是,我UPDATE是否可以期望即使在开始后出现的行也会更新?(键DEFAULT 'value'在其定义中没有)
locking ×10
sql-server ×5
postgresql ×3
innodb ×2
mysql ×2
concurrency ×1
deadlock ×1
mysql-5.5 ×1
mysql-5.6 ×1
optimization ×1
performance ×1
select ×1
transaction ×1
wait-types ×1