有没有办法不在MySQL中获得锁?

有没有办法不在MySQL中获得锁?,mysql,deadlock,database-deadlocks,Mysql,Deadlock,Database Deadlocks,我有一个每天运行一次的查询,它从我的数据库中获取某些表,并将它们放入一个表中,这样我就可以以我需要的任何格式快速导出信息 但是,我遇到了一个问题,它给了我以下错误:“SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务” 据我所知,我的查询似乎是试图在已有锁的情况下获得表上的锁。不过,我承认,我对表锁定或其工作原理一无所知 实际上,我只是尝试读取其他表而不是写入它们,有没有一种方法可以创建查询但不请求锁 我的查询太长了,所以我没有发布。如果您需要某些部分,请

我有一个每天运行一次的查询,它从我的数据库中获取某些表,并将它们放入一个表中,这样我就可以以我需要的任何格式快速导出信息

但是,我遇到了一个问题,它给了我以下错误:“SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务”

据我所知,我的查询似乎是试图在已有锁的情况下获得表上的锁。不过,我承认,我对表锁定或其工作原理一无所知

实际上,我只是尝试读取其他表而不是写入它们,有没有一种方法可以创建查询但不请求锁


我的查询太长了,所以我没有发布。如果您需要某些部分,请告诉我,我可以发布它们。

如果您处于事务隔离模式REPEATABLE_READ(这是默认设置),则选择“不应创建任何锁”。这是正常的

但是,如果您使用的是insert。。。选择此选项当然会在目标表中获得锁

因此,如果没有其他人写入目标表,并且一次最多运行一个程序副本,则永远不会出现死锁

死锁发生在两个(或更多)进程尝试执行无法完成的冲突操作时。通常这涉及以不同的顺序更新同一对行,但这可能取决于表结构

考虑的想法:

  • 使用外部锁(对innodb)对多个副本序列化进程
  • 将事务隔离模式更改为读取此操作提交的\u-如果您理解这意味着什么并且能够容忍它
  • 在一个事务中做更少的工作(更频繁地提交)
您可以在死锁发生后立即使用ShowEngine INNODB STATUS查看死锁中涉及的事务在做什么

您应该能够看到其他进程是什么以及它们在做什么。考虑打开通用日志或使用其他调试技术。


确保在非生产系统中进行任何测试

如果您处于事务隔离模式REPEATABLE_READ(这是默认设置),则选择不应创建任何锁。这是正常的

但是,如果您使用的是insert。。。选择此选项当然会在目标表中获得锁

因此,如果没有其他人写入目标表,并且一次最多运行一个程序副本,则永远不会出现死锁

死锁发生在两个(或更多)进程尝试执行无法完成的冲突操作时。通常这涉及以不同的顺序更新同一对行,但这可能取决于表结构

考虑的想法:

  • 使用外部锁(对innodb)对多个副本序列化进程
  • 将事务隔离模式更改为读取此操作提交的\u-如果您理解这意味着什么并且能够容忍它
  • 在一个事务中做更少的工作(更频繁地提交)
您可以在死锁发生后立即使用ShowEngine INNODB STATUS查看死锁中涉及的事务在做什么

您应该能够看到其他进程是什么以及它们在做什么。考虑打开通用日志或使用其他调试技术。

确保在非生产系统中进行任何测试

您可以尝试使用,它的作用如下:

当客户机使用INSERT DELAYED时,它会立即从服务器获得一个OK,并且当该表未被任何其他线程使用时,该行将排队等待插入

如果您希望看到处于混合状态的数据,可以更改事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- Problematic SELECT query goes here --
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
我从另一个答案中学到了这一点,所以您可以尝试使用,下面是它的作用:

当客户机使用INSERT DELAYED时,它会立即从服务器获得一个OK,并且当该表未被任何其他线程使用时,该行将排队等待插入

如果您希望看到处于混合状态的数据,可以更改事务隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- Problematic SELECT query goes here --
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

我从另一个表中了解到了这一点,所以回答

表的类型?InnoDB或MyISAM?表的类型?InnoDB或MyISAM?这不适用于InnoDB表,因为它们不支持插入延迟。这不适用于InnoDB表,因为它们不支持插入延迟。