AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[blocking](dba)

Martin Hope
Q''
Asked: 2021-10-06 06:30:36 +0800 CST

如何在不遭受竞争条件的情况下将表用作 GUID 池?

  • 1

我处于一个位置,我将获得一个 GUID 列表,这些 GUID 将由 SQL Server 数据库在运行时分配。

我的直接想法是为 GUID 创建一个表。当订购一批 GUID 时,它们将被插入到表中。

然后,在运行时,将调用一个 SPROC 从表中选择一个 GUID。我可以检索下一个 GUID 并立即从表中删除它,或者检索下一个 GUID 并更新另一列以将其声明为已使用。

但这让我想知道同时对数据库进行两次调用以获得 GUID 的竞争条件的可能性。在我看来,如果时间完全不方便,则可以为这两个调用检索相同的 GUID。

Q1:我担心这种潜在的竞争状况是否正确?即它会发生吗?

Q2:有没有办法避免这种情况(例如设置一个 SPROC 来阻止每次调用?)

我能想到的一种至少可以使竞争条件失败的方法是设置另一个进行 GUID 分配的表,并将 GUID 列设置为唯一。然后,在运行时过程中,当检索到 GUID 时,它将通过 GUID 分配表分配给产品。如果为两种产品颁发了相同的 GUID,那么当需要分配它们时,其中一种产品将无法分配并被拒绝。

sql-server blocking
  • 1 个回答
  • 71 Views
Martin Hope
YHTAN
Asked: 2021-06-28 13:48:27 +0800 CST

关于锁定和覆盖索引的理解问题

  • 0

根据我的研究,我发现很多人提到覆盖索引将有助于减少“键查找”阻塞。我热衷于测试和理解它,但我的测试并没有显示出预期的结果。

首先我运行下面的代码,我尝试在第一个事务上更新表而不提交,然后在另一个会话上,我运行一个查询以从 tableA 中选择 col2 和 col3。根据这本书,第二个会话将被第一个会话阻止。

-- Create the table for testing
CREATE TABLE [TableA] 
(   
    [col1] INT,
    [col2] INT, 
    [col3] INT, 
    [col4] CHAR(100) DEFAULT('abc') NOT NULL
);
GO

DECLARE @int INT;
SET @int = 1;

-- Load data into the table
WHILE (@int <= 1000) 
BEGIN
    INSERT INTO [TableA] 
        ([col1], [col2], [col3], [col4])
    VALUES (@int*2, @int*2, @int*2, @int*2);
    SET @int = @int + 1;
END
GO

CREATE CLUSTERED INDEX [cidx_TableA] 
ON [TableA] ([col1]);

-- Create a non-clustered index
CREATE NONCLUSTERED INDEX [idx_TableA_col2] 
ON [TableA] ([col2]);
GO

BEGIN TRANSACTION
    UPDATE [TableA] SET col3=999 WHERE Col2=4
--Rollback

--ON another session, I query this.
SELECT [col2],col3 FROM [TableA] 
WHERE [col2]=66
option (recompile)

第二个会话确实使用对集群索引 cidx_TableA 的键查找并返回结果,我希望它不会返回任何结果,因为假设它会通过第一个会话的更新锁定。为什么?

我还没有创建覆盖索引,因为它根本没有任何阻塞。那么,覆盖指数真的有效吗?

在此处输入图像描述

sql-server blocking
  • 1 个回答
  • 67 Views
Martin Hope
gavenkoa
Asked: 2021-04-02 07:12:38 +0800 CST

锁定是否意味着等待?

  • 0

我真的不明白在并发数据访问的情况下等待的承诺。

所有手册均按期限锁定。没有人解释锁可能会导致 SQL 客户端在服务器端等待锁获取(并且可能需要几秒/分钟/无穷大)?

是否存在锁不会导致等待的情况?我能想象:

  • 可能READ UNCOMMITTED在某些情况下,比如没有 DDL?
  • 不等就报错了...
  • 没有人等待,但谁先commit获胜,其他人失败commit

我回顾了JDBC API:它从字面上提到:

SQLTimeoutException - 当驱动程序确定已超过setQueryTimeout方法指定的超时值并且至少尝试取消当前正在运行的语句时`

根据文档在客户端检测到超时。广泛使用的客户端 API对服务器端超时没有影响(包括由锁引起的)。可能您可以设置一些专有的连接属性来影响数据库行为。

我看到了一些专有的 SQL 扩展,例如:

  • https://learn.microsoft.com/en-us/sql/t-sql/statements/set-lock-timeout-transact-sql SET LOCK_TIMEOUT timeout_period
  • https://www.postgresql.org/docs/13/runtime-config-client.html set lock_timeout ms &set statement_timeout ms

对我来说,由于锁而等待的数据库是一个灰色区域。锁定是否意味着等待?

locking blocking
  • 1 个回答
  • 132 Views
Martin Hope
sam.bishop
Asked: 2020-12-11 15:00:35 +0800 CST

获取所有与锁对应的 SQL

  • 0

我最近参与调试一个棘手的 SQL Server 锁定问题。我们最终通过研究应用程序代码弄清楚了发生了什么,但如果 SQL Server 提供更多信息会容易得多。我想知道是否有办法获取这些信息。这是一个简单的复制:

create table Table1 (k int primary key)
create table Table2 (k int primary key)
go

begin transaction
insert into Table1 values (1)  -- acquire a lock
go

insert into Table2 values (2)  -- acquire a second lock
go

我没有显示它,但应用程序正在提交事务,因为它应该有。但是,在提交发生之前,它会导致阻塞,并且我们的调试工具只报告最后执行的批处理/语句的文本——在这种情况下插入到 Table2 中——以及对应于完全不同对象的锁。(我的示例中的表 1。)

有没有办法获取与会话持有的所有锁相对应的 SQL,而不仅仅是最近的一批?

sql-server blocking
  • 1 个回答
  • 25 Views
Martin Hope
user960567
Asked: 2020-11-05 10:37:39 +0800 CST

缩小阻塞会话

  • 0

我正在使用不同的查询来查找阻塞查询。例如,

select
       ec.session_id,
       er.blocking_session_id,
       datediff(s, es.last_request_start_time, GETDATE()) as elapsed_time_sec,
       er.command,
       es.login_name,
       es.host_name,
       es.host_process_id,
       DB_NAME(er.database_id) as database_name,
       esql.text AS batch_text,
       ISNULL(CASE er.statement_end_offset + er.statement_start_offset
             WHEN 0 THEN esql.text 
             ELSE SUBSTRING(esql.text,
                          (er.statement_start_offset/2)+1, 
                          ((CASE er.statement_end_offset
                                       WHEN -1 THEN DATALENGTH(esql.text)
                                       ELSE er.statement_end_offset
                            END - er.statement_start_offset)/2) + 1)
       END, '')
       AS statement_text,
       eplan.query_plan,
       es.program_name,
       es.host_process_id,
       es.last_request_start_time,
       es.last_request_end_time,
       ec.num_reads as num_reads_connection,
       ec.num_writes as num_writes_connection,
       es.reads as reads_session,
       es.writes as writes_session,
       es.logical_reads,
       es.transaction_isolation_level,
       es.row_count,
       er.wait_type,
       er.wait_time
from 
       sys.dm_exec_connections ec
       left join sys.dm_exec_sessions es on ec.session_id = es.session_id
       left join sys.dm_exec_requests er on ec.session_id = er.session_id
       --left join sys.dm_exec_sessions es_blocking on es.session_id = er.blocking_session_id
       outer apply sys.dm_exec_sql_text(er.sql_handle) esql
       outer apply sys.dm_exec_query_plan(er.plan_handle) eplan
where es.status <> 'sleeping'
order by ec.session_id

在这里,我首先检查blocking_session_id 不为空的行。然后从这个blocking_session_id,发现它也被别人block了等等。所以,假设我有,

| -------------------- |
| Spid | Blokcing_Spid |
| -------------------- |
| 1 | 2 |
| 2 | 3 | 
| 3 | 4 | 
| 4 | NULL | 

这里4是罪魁祸首。我怎样才能快速找到罪魁祸首?

sql-server blocking
  • 1 个回答
  • 45 Views
Martin Hope
Jianqing
Asked: 2018-08-08 23:17:41 +0800 CST

MySQL 插入操作挂起,而另一个更新操作正在运行,但无法弄清楚原因

  • 0

事务 1:

begin;
update t_info set gender=1 where c_score > 85;

交易 2:

begin;
insert into t_info(c_id,c_class_no,c_score,c_name,gender) values (4,99,50,'gap',1);

事务 2 挂起,我不明白为什么。

前提条件:mysql Ver 14.14 Distrib 5.7.19-17tx_isolation:REPEATABLE-READ

DROP TABLE IF EXISTS `t_info`;
CREATE TABLE `t_info` (
  `c_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `c_class_no` int(11) NOT NULL DEFAULT '-1',
  `c_score` int(11) NOT NULL DEFAULT '0',
  `c_name` varchar(25) NOT NULL,
  `gender` tinyint(4) NOT NULL COMMENT '0 male, 1 female',
  PRIMARY KEY (`c_id`),
  KEY `idx_name_score` (`c_name`,`c_score`),
  KEY `idx_score` (`c_score`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `t_info` 
VALUES 
(1,1,60,'no1',0),
(2,2,60,'no2',0),
(3,3,60,'no3',0),
(6,4,78,'gap',1),
(7,5,95,'no5',0),
(10,8,87,'jianhaiqing',0),
(11,36,20,'no20',0),
(14,13,100,'no13',0),
(20,21,120,'no21',0),
(21,24,83,'no87-2',0);

表格记录

mysql blocking
  • 2 个回答
  • 1168 Views
Martin Hope
Jérôme Verstrynge
Asked: 2018-07-18 05:44:45 +0800 CST

TRUNCATE 或 DROP 表会非常耗时吗?

  • 2

几个月前,我在一个(维护得不太好的)数据库中发现了一个完全无用的表,其中包含 4.3 亿个未索引的行,每天增长约 80 000 行。

它是移除的最佳候选者。但是,我从来没有机会实现这一目标(也不是优先事项)。我什至没有机会尝试在每周刷新的开发数据库中删除它。

我想知道一个简单的 TRUNCATE 或 DROP 是否会非常耗时?我的意思是,如果写得不好,这个操作会不会像 DELETE 那样阻塞生产环境几分钟。还是这些安全操作?

mysql blocking
  • 3 个回答
  • 4988 Views
Martin Hope
Ya.
Asked: 2016-09-16 17:26:33 +0800 CST

空闲的会话如何阻止会话?

  • 0

我正在尝试使用以下查询来识别阻塞会话:

SELECT
  v1.sid esid,  v1.blocking_session bsid,  v1.process,  v1.wait_class,  v1.event,  v1.sql_id,  v1.seconds_in_wait waitss,  v2.blocking_session bsid2,  v2.process,
  v2.sql_id,  v2.wait_class,  v2.event
from
  v$session v1, v$session v2
where
  v1.blocking_session is not null and v1.blocking_session = v2.sid
order by
  waitss desc

这是示例输出:

ESID    BSID    PROCESS WAIT_CLASS  EVENT                           SQL_ID          WAITSS  BSID2   PROCESS_1 SQL_ID_1 WAIT_CLASS_1 EVENT_1
2707    2313    8526    Application enq: TX - row lock contention   05v90pbavkptk   11      (null)  28152     (null)   Idle         SQL*Net message from client

这表明阻塞会话是空闲的。也许我遗漏了一些东西,但我不明白没有执行任何语句的空闲会话如何阻塞任何东西。

oracle blocking
  • 1 个回答
  • 2520 Views
Martin Hope
Chris Woods
Asked: 2016-04-21 07:16:21 +0800 CST

未知系统 SPID 阻止用户 SPID

  • 3

我们正在执行第 3 方数据的迁移,但它已挂起。

当我们调查时,我们看到 SPID 38(系统/后台 SPID)是试图进行迁移的阻止用户 SPID。不幸的是,来自sp_whoisactive(或什至活动监视器)的 SQL_Text 对于 SPID 38是NULL。wait_info是PREEMPTIVE_OS_GENERICOPS.

有没有办法告诉 38 试图做什么?

它使用的是第 3 方提供给我们的基于 Windows 的工具。我对数据进行了备份,并将其还原到这台新服务器上(这样数据库及其内容就可以访问并正常工作了)。然后我们运行这个工具来升级到他们的新版本软件,这就是我们获取块的地方。

sp_WhoIsActive @get_locks = 1返回一个非常长的 XML(4k 个字符太长而无法发布)。

sql-server blocking
  • 1 个回答
  • 952 Views
Martin Hope
xav
Asked: 2015-11-04 18:02:00 +0800 CST

在维护窗口中运行的脚本的锁定优先级

  • 3

我们每周和每月运行一次维护窗口。我们的一些维护窗口是在线的,我们最不想要的就是我们的脚本阻止来自我们应用程序的实时查询。

有没有办法设置查询的优先级,使其不会导致其他查询阻塞超过 X 秒?

例子:

  • 我在表 A 上运行维护脚本 A
  • 应用程序正在更新表 A 上的一行,等待维护脚本完成。
  • SQL Server 在阻塞 X 秒后自动终止并回滚我的维护脚本。

    我知道死锁有类似的功能(将死锁受害者设置为低)。

    谢谢!

  • sql-server blocking
    • 1 个回答
    • 500 Views

    Sidebar

    Stats

    • 问题 205573
    • 回答 270741
    • 最佳答案 135370
    • 用户 68524
    • 热门
    • 回答
    • Marko Smith

      连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

      • 12 个回答
    • Marko Smith

      如何让sqlplus的输出出现在一行中?

      • 3 个回答
    • Marko Smith

      选择具有最大日期或最晚日期的日期

      • 3 个回答
    • Marko Smith

      如何列出 PostgreSQL 中的所有模式?

      • 4 个回答
    • Marko Smith

      列出指定表的所有列

      • 5 个回答
    • Marko Smith

      如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

      • 4 个回答
    • Marko Smith

      你如何mysqldump特定的表?

      • 4 个回答
    • Marko Smith

      使用 psql 列出数据库权限

      • 10 个回答
    • Marko Smith

      如何从 PostgreSQL 中的选择查询中将值插入表中?

      • 4 个回答
    • Marko Smith

      如何使用 psql 列出所有数据库和表?

      • 7 个回答
    • Martin Hope
      Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
    • Martin Hope
      Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
    • Martin Hope
      Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
    • Martin Hope
      Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
    • Martin Hope
      haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
    • Martin Hope
      qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
    • Martin Hope
      markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
    • Martin Hope
      Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
    • Martin Hope
      Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
    • Martin Hope
      Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

    热门标签

    sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

    Explore

    • 主页
    • 问题
      • 最新
      • 热门
    • 标签
    • 帮助

    Footer

    AskOverflow.Dev

    关于我们

    • 关于我们
    • 联系我们

    Legal Stuff

    • Privacy Policy

    Language

    • Pt
    • Server
    • Unix

    © 2023 AskOverflow.DEV All Rights Reserve