首页 > 数据库 >18.2 SQL Server死锁

18.2 SQL Server死锁

时间:2023-01-30 21:44:06浏览次数:50  
标签:invoices items Server 会话 死锁 invoice 18.2 id

SQL Server死锁

目录

简介

死锁是一个并发问题,其中两个会话会阻止彼此的进程。第一个会话锁定了另一个会话想要访问的资源,反之亦然。

下图说明了SQL Server中的死锁:

此图中,invoicesinvoices_items是两张表。

  • 首先,会话一访问invoices表并将其锁定。
  • 第二,会话二锁定invoice_items表并将其锁定。
  • 第三,会话一还想要访问invoice_items表,但需要等待会话二完成。同时,会话二想要访问invoices表,但需要等待会话二完成。

这样,两个会话都在等待对方完成,从而导致死锁。

因此,两个会话将相互等待,直到SQL Server主动终止其中一个会话。SQL Server终止的会话称为死锁牺牲者。

示例

看一个创建死锁的示例。在本例中,我们将首先创建invoices(发票)和invoice_items(发票项)表:

CREATE TABLE invoices (
  id int IDENTITY PRIMARY KEY,
  customer_id int NOT NULL,
  total decimal(10, 2) NOT NULL DEFAULT 0 CHECK (total >= 0) 
);

CREATE TABLE invoice_items (
  id int,
  invoice_id int NOT NULL,
  item_name varchar(100) NOT NULL,
  amount decimal(10, 2) NOT NULL CHECK (amount >= 0),
  tax decimal(4, 2) NOT NULL CHECK (tax >= 0),
  PRIMARY KEY (id, invoice_id),
  FOREIGN KEY (invoice_id) REFERENCES invoices (id)
     ON UPDATE CASCADE
     ON DELETE CASCADE
);

INSERT INTO invoices (customer_id, total)
  VALUES (100, 0);

INSERT INTO invoice_items (id, invoice_id, item_name, amount, tax)
  VALUES (10, 1, 'Keyboard', 70, 0.08),
  (20, 1, 'Mouse', 50, 0.08);

UPDATE invoices
SET total = (SELECT
  SUM(amount * (1 + tax))
  FROM invoice_items
  WHERE invoice_id = 1
);

然后,我们将创建两个会话来连接到数据库。下面是需要从每个会话执行的语句序列。

会话1 会话2
BEGIN TRAN;
BEGIN TRAN;
UPDATE invoices SET customer_id = 100 WHERE id = 1;
UPDATE invoice_items SET amount = 100 WHERE id = 10;
UPDATE invoice_items SET item_name = ‘Cool Keyboard’ WHERE id = 10;
Blocked UPDATE invoices SET total = (SELECT SUM(amount * (1 + tax)) FROM invoice_items WHERE invoice_id = 1) WHERE id = 1;
Blocked

一旦发生死锁,SQL Server将杀死死锁牺牲者。在我们的例子中,死锁牺牲者是进程ID 65。

Transaction (Process ID 65) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

标签:invoices,items,Server,会话,死锁,invoice,18.2,id
From: https://www.cnblogs.com/michaelshen/p/17077332.html

相关文章

  • Simple-Web-Server HTTP开源服务器库
    1下载网址​ ​​https://gitlab.com/eidheim/Simple-Web-Server​​2实现HTTP短连接默认的HTTP协议都是短连接,服务器返回响应报文,就会主动断开,测试发现,当前库不会主动断......
  • SQL Server 安装、配置、迁移 三
    本片博文记录数据迁移。两台电脑,一台IP地址为:10.15.66.168,有名为TestprgDB的数据库,另一台IP地址10.15.66.169,无数据库。本次任务目的为把168电脑的数据库拷贝到169电脑。......
  • 部署 metrics-server
    安装metrics-server通过kubeadm安装的k8s集群默认是没有安装metrics-server,因此需要手工安装。k8s版本v1.22.2系统AnolisO......
  • SQL Server 安装、配置、迁移 二
    本篇博客记录网络配置。本机IP地址:10.15.66.169打开配置界面,如图所示设置TCP/IP为Enabled。双击TCP/IP,出现TCP/IPProperties窗口。选择一个指向本......
  • identityserver4 客户claims里没有用户姓名的问题
    客户端代码JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();services.AddAuthentication(options=>{options.DefaultSch......
  • 15.1 SQL Server创建LOGIN(登录)
    SQLServer创建LOGIN(登录)目录SQLServer创建LOGIN(登录)简介示例SQLServerCREATELOGIN语句更多选项CHECK_POLICY选项CHECK_EXPIRATION选项MUST_CHANGE选项从Windows域帐......
  • 二手MicroServer Gen8折腾记
    上个月冲动消费,入手了一台HPEProLiantMicroServerGen8。其实我早想搞一台正经的服务器来玩了,因为群晖的魔改Linux总是玩的不那么爽。现在心愿实现,开始折腾。重置iLO到......
  • k8s集群不可用:The connection to the server 192.168.117.161:6443 was refused -
    虚拟机非正常关机后,k8s集群不可用获取节点,报如下错,kubectlgetnode 查看env:env|grep-ikubernetes 查看docker状态:systemctlstatusdocker 查看kubelet状态:systemct......
  • Windows server 2012 安装ad域
    Windowsserver2012安装ad域 安装ad域(activedirectory)服务的作用:存储目录数据并管理域之间的通信,包括用户登录处理,身份验证和目录搜索等。 1.使用administrator......
  • SQL Server 安装 一
    平时很少涉及数据库相关的任务,每当要使用时,就搜索查找,用后就忘。这次决定把相关过程记录下来,供自己参考。先下载两个软件:SQL2017Express(数据库)和SQLServerManagemen......