AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 139479
Accepted
SQLPRODDBA
SQLPRODDBA
Asked: 2016-05-26 03:54:39 +0800 CST2016-05-26 03:54:39 +0800 CST 2016-05-26 03:54:39 +0800 CST

Simular deadlock com mais de 2 processos

  • 772

Como simular deadlock com mais de 2 processos no ambiente de teste do SQL Server? Alguém pode me ajudar com o código? Só para esclarecer minha dúvida novamente, não quero simulação de deadlock com apenas 2 processos. Eu sei produzir deadlock com 2 processos, mas não consigo produzi-lo com mais de dois processos.

sql-server deadlock
  • 1 1 respostas
  • 1475 Views

1 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2016-05-26T05:32:11+08:002016-05-26T05:32:11+08:00

    Se você sabe simular com 2, sabe simular com 3, ou com N. Você tem que construir um grafo cíclico :

    • 2 nós: A->B->A (processo A espera em B, processo B espera em A)
    • 3 nós: A->B->C->A (processo A espera em B, B espera em C, C espera em A)
    • ...
    • N nós: P 1 ->P 2 ->...P n ->P 1

    Para construir a primitiva P x ->P y (Processo X espera no Processo Y) use seu mecanismo de bloqueio favorito. Por exemplo, bloqueio de linha em uma chave específica P 1 ->P 2 ->P 3 ->P 1 :

    CREATE TABLE rows (key INT NOT NULL PRIMARY KEY);
    

    1) P 1 , da sessão 1:

    BEGIN TRANSACTION
    INSERT INTO rows (key) VALUES (1);
    

    2) P 2 , da sessão 2:

    BEGIN TRANSACTION
    INSERT INTO rows (key) VALUES (2);
    

    3) Faça P 1 esperar em P 2 . Da sessão 1:

    SELECT key FROM rows WHERE key = 2;
    

    4) Continue com P 3 , sessão 3:

    BEGIN TRANSACTION
    INSERT INTO rows (key) VALUES (3);
    

    5) Adicione a espera P 2 ->P 3 , na sessão 2:

    SELECT key FROM rows WHERE key = 3;
    

    6) Para completar o ciclo, adicione a espera P 3 ->P 1 , na sessão 3:

    SELECT key FROM rows WHERE key = 1;
    

    Como o grafo de espera criou um ciclo, os 3 processos agora estão em impasse. Em pouco tempo, o mecanismo de detecção de deadlock do mecanismo (que percorre periodicamente os gráficos de espera procurando por ciclos) detecta esse ciclo e o interrompe, escolhendo uma vítima e abortando sua transação, gerando o erro 1205 na sessão da vítima.

    Para estender para N nós, repita as etapas 4) e 5) conforme necessário.

    • 19

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve