首页 > 数据库 >记一个引起MYSQL死锁Deadlock found when trying to get lock; try restarting transaction的例子 及 Share Locks和排它锁

记一个引起MYSQL死锁Deadlock found when trying to get lock; try restarting transaction的例子 及 Share Locks和排它锁

时间:2024-07-20 13:26:27浏览次数:14  
标签:... 执行 show Share update 死锁 trying select

一、记一个引起MYSQL死锁Deadlock found when trying to get lock; try restarting transaction的例子

    今天在尝试MYSQL事务的时候,这种情况总会引起死锁,不知道为什么,我使用的测试MYSQL表的创建SQL如下:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(10) unsigned NOT NULL DEFAULT '20',
  `nowtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

我已经通过命令修改全局的事务隔离级别:

SET @@global.tx_isolation=\'SERIALIZABLE\';
show variables like '%tx_isolation%';

其中在一个终端执行SQL命令A:

show variables like '%tx_isolation%';
set autocommit=0;
START TRANSACTION;
	select user.*,SLEEP(3) as tt from user where id=4;
	update user set age=200 where id=4;
#ROLLBACK;
COMMIT;
show WARNINGS;

在另外一个终端执行命令B:

show variables like '%tx_isolation%';
set autocommit=0;
START TRANSACTION;
  select * from user  where id=4;
	update user set age=age-5 where id=4;
COMMIT;

    执行命令A之后(因为sleep(3)的作用,会用一些时间),在此期间执行B。验证事务的SERIALIZABLE级别时的顺序执行。测试时也能看到事务是顺序执行的,即B事务必须等到A事务执行完毕才执行结束。

    两个命令分别执行(非同时)是没有问题的,但是先执行A,再执行B。B等待A执行完成后再执行,

    最后会报错:Deadlock found when trying to get lock; try restarting transaction。但不清楚这样为什么会报这个错误,试了一下也不是autocommit的值的问题。目前也没时间去排查吧。先留在这里做个记录。

#其它几个辅助的查询语句

#1,查询系统表中的锁信息
select * from information_schema.INNODB_LOCK_WAITS;
select * from information_schema.INNODB_LOCKS;
select * from information_schema.INNODB_TRX;
#发生死锁时查询死锁发生的SQL和时间
show engine innodb status;
#显示当前查询
show full processlist;
#查询innodb的锁等待超时配置
show VARIABLES like '%innodb_lock_wait_timeout%';

#。 本文 publish:April 13, 2017 -Thursday 的相关评论转载至此:

Level : 1.    User:us20190921182919-303    Time:2019-09-21 18:37:14
因为两个select语句都存在读锁,所以在执行update的时候,写锁会阻塞

Level : 2.    User:us20190316202924-932    Time:2019-09-24 21:40:58
[04007],嗯。SERIALIZABLE隔离级别死锁问题:

Level : 3.    User:us20231207153702-897    Time:2023-12-07 16:14:35
[04007] 由多个事务同时访问同一数据,其中一个事务获取了排他锁,而另一个事务也想获取该排他锁,而此时第二个事务无法获取该数据的排他锁,从而导致死锁的产生。SERIALIZABLE 级别并不能避免死锁的产生。

二、关于mysql数据库innodb引擎的共享锁Share Locks和排它锁Exclusive Locks

1. MySQL共有三种锁的级别:页级、表级、行级。

    MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking)
    BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;
    InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

我这里就只看innodb引擎的两个锁:共享锁(Share Locks)和排它锁(Exclusive Locks)

2. SELECT ... FOR UPDATE

    这即是排它锁(Exclusive Locks,即X锁)的实现,其在执行后会阻止其它对此行记录的for update读取和修改等操作。必须等到此锁释放其它业务才能操作。但可以允许普通的select操作,因为普通的select查询的是数据快照。这种操作就是悲观锁,可以防止出现问题。

3. select ... LOCK IN SHARE MODE

    这即是共享锁(Share Locks,即S锁)的实现,执行select ... LOCK IN SHARE MODE能读取最新的数据,select结果的全部行都会加行锁(如果这些行已被其它事务先加锁,如for update,则等待锁释放后再加锁),其它事务不能select .... for update、update和delete操作这些行记录,直到锁释放。

select ... FOR UPDATE同时只能有一个在语句执行,另一个会阻塞;select ... LOCK IN SHARE MODE可以多个同时执行(这也是和for update最大的区别)

select ... FOR UPDATE不会出现数据更新丢失等问题,select ... LOCK IN SHARE MODE可能会出现数据更新丢失。

    总之我觉得高并发下要保证不会出问题,使用for update是个比较好的方案。我一直也是使用的这个方案,当然某些情况下也会使用乐观锁。

    另外select ... lock in share mode运行时会在正在读取的行上加share mode lock.所以select ... lock in share mode在运行期间尚未读取某一行时,如果在这时对某一行进行更新是可以的。

标签:...,执行,show,Share,update,死锁,trying,select
From: https://blog.csdn.net/weixin_47792780/article/details/140454829

相关文章

  • 什么是死锁 , 以及产生的原因详细介绍
    死锁一.什么是死锁指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁,通俗的说死锁产生的原因主要是由于线程的相互等待,导致程序无法进行下去二.代码阐述这里我们写......
  • SharedPreferences 和 MMKV 是何方神圣
    一、概述SharedPreferences和MMKV都是Android平台保存本地数据的工具,用于保存一些常用配置。二、SharedPreferences1.类似Map集合,将Key-Value对存储于硬盘上的XML文件,以XML文件的形式保存在/data/data/包名/shared_prefs目录下。数据较多时会有性能问题。2.SharedPrefe......
  • 打破僵局:深度解析数据库死锁的策略与实践(专家篇)
    在多任务操作系统和数据库管理系统中,死锁是一个常见问题,它发生在两个或多个进程/线程因争夺资源而相互等待,导致系统资源无法继续执行。有效地检测和预防死锁对于确保系统稳定性和提高系统性能至关重要。本次探讨不同的死锁检测与预防策略,以及如何在实际应用中实现这些策略......
  • 死锁和产生死锁的条件
    死锁:多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源的释放,由于线程被无限期地阻塞,因此程序不可能正常终止下面展示一些简单死锁代码实例。packagecom.haina.Thread61;publicclassDeadLock{privateObjecto1=newObject();privateObjecto2=......
  • deepspeed训练模型提示:cpu_adam.so: cannot open shared object file: No such file o
    背景本人在安装deepspeed后遇到了这个报错,明眼人一看就是缺库,但是搜索到的解决方案(凌漪_,2023)说是设置一个环境变量,实在是治标不治本,而且对本人来说连标都治不了。其他的博客尚未看到解决此问题的。分析这个so文件理论上应该在安装deepspeed的过程中就自动编译好了,但是......
  • 死锁案例
    1publicpartialclassForm1:Form2{3publicForm1()4{5InitializeComponent();6}78privatevoidForm1_Load(objectsender,EventArgse)9{1011}1213private......
  • 面试篇-Java-1+锁+AQS+死锁
    文章目录前言一、并发编程中你都用过哪些锁1.1Synchronized【对象锁】1.1.1Synchronized的使用1.1.2你知道Synchronized的原理吗1.1.2.1你知道monitor的结构1.1.3Synchronized的实现原理1.1.3你知道Synchronized锁的升级吗1.1.3.1你知道对象头的内存结构和对......
  • ARMv8中non-shareable inner-shareable outer-shareable属性
    如果将block的内存属性配置成Non-cacheable,那么数据就不会被缓存到cache,那么所有observer看到的内存是一致的,也就说此时也相当于OuterShareable。其实官方文档,也有这一句的描述:在B2.7.2章节“Dataaccessestomemorylocationsarecoherentforallobserversinthesys......
  • 面试官:MySQL死锁是什么,如何解决?
    MySQL死锁概述定义:多个操作相互等待对方释放资源,导致无法继续执行的情况。场景:通常发生在多个事务同时试图锁定对方已锁定的资源时。MySQL锁的分类粒度分类:表级锁:锁定整个表,简单但并发能力低。行级锁:锁定特定行,开销大,可能死锁,但并发度高。页级锁:锁定数据库页,介于表级和......
  • 读论文《OSCNet: Orientation-Shared ConvolutionalNetwork for CT Metal Artifact Le
    论文题目:面向共享的CT金属伪影学习卷积网络论文主题:金属伪影去噪论文地址:OSCNet_TMI2023.pdf-Google云端硬盘这个是oscnet+,oscnet进阶版,感觉和acdnet很像其实,本文读论文,下一篇博客讲讲复现摘要:        在本文中,我们仔细研究了具有旋转对称条纹图案的金属工件......