有没有办法不在MySQL中获得锁?
我有一个每天运行一次的查询,它从我的数据库中获取某些表,并将它们放入一个表中,这样我就可以以我需要的任何格式快速导出信息 但是,我遇到了一个问题,它给了我以下错误:“SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务” 据我所知,我的查询似乎是试图在已有锁的情况下获得表上的锁。不过,我承认,我对表锁定或其工作原理一无所知 实际上,我只是尝试读取其他表而不是写入它们,有没有一种方法可以创建查询但不请求锁有没有办法不在MySQL中获得锁?,mysql,deadlock,database-deadlocks,Mysql,Deadlock,Database Deadlocks,我有一个每天运行一次的查询,它从我的数据库中获取某些表,并将它们放入一个表中,这样我就可以以我需要的任何格式快速导出信息 但是,我遇到了一个问题,它给了我以下错误:“SQLSTATE[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试重新启动事务” 据我所知,我的查询似乎是试图在已有锁的情况下获得表上的锁。不过,我承认,我对表锁定或其工作原理一无所知 实际上,我只是尝试读取其他表而不是写入它们,有没有一种方法可以创建查询但不请求锁 我的查询太长了,所以我没有发布。如果您需要某些部分,请
我的查询太长了,所以我没有发布。如果您需要某些部分,请告诉我,我可以发布它们。如果您处于事务隔离模式REPEATABLE_READ(这是默认设置),则选择“不应创建任何锁”。这是正常的 但是,如果您使用的是insert。。。选择此选项当然会在目标表中获得锁 因此,如果没有其他人写入目标表,并且一次最多运行一个程序副本,则永远不会出现死锁 死锁发生在两个(或更多)进程尝试执行无法完成的冲突操作时。通常这涉及以不同的顺序更新同一对行,但这可能取决于表结构 考虑的想法:
- 使用外部锁(对innodb)对多个副本序列化进程
- 将事务隔离模式更改为读取此操作提交的\u-如果您理解这意味着什么并且能够容忍它
- 在一个事务中做更少的工作(更频繁地提交)
确保在非生产系统中进行任何测试 如果您处于事务隔离模式REPEATABLE_READ(这是默认设置),则选择不应创建任何锁。这是正常的 但是,如果您使用的是insert。。。选择此选项当然会在目标表中获得锁 因此,如果没有其他人写入目标表,并且一次最多运行一个程序副本,则永远不会出现死锁 死锁发生在两个(或更多)进程尝试执行无法完成的冲突操作时。通常这涉及以不同的顺序更新同一对行,但这可能取决于表结构 考虑的想法:
- 使用外部锁(对innodb)对多个副本序列化进程
- 将事务隔离模式更改为读取此操作提交的\u-如果您理解这意味着什么并且能够容忍它
- 在一个事务中做更少的工作(更频繁地提交)
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表,因为它们不支持插入延迟。