Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中两个插入的锁是如何工作的?_Mysql_Database_Isolation Level - Fatal编程技术网

MySQL中两个插入的锁是如何工作的?

MySQL中两个插入的锁是如何工作的?,mysql,database,isolation-level,Mysql,Database,Isolation Level,假设隔离级别是可重复读取的,因为它实际上是MySQL的默认值 我有两个插入(没有检查,没有唯一的列) a) 假设这两个插入同时发生。会发生什么?它会首先在不同的MySQL线程中运行第一个insert和第二个insert,还是同时运行这两个insert b) 假设insert语句和名为vehicle\u id的列是唯一的,但在此之前,我检查它是否存在。如果它不存在,请继续并插入。假设代码中的两个线程同时出现。因此,它们都将进入if语句,因为它们发生在同一时刻 现在,它们都必须使用相同的车辆id进行

假设隔离级别是可重复读取的,因为它实际上是MySQL的默认值

我有两个插入(没有检查,没有唯一的列)

a) 假设这两个插入同时发生。会发生什么?它会首先在不同的MySQL线程中运行第一个insert和第二个insert,还是同时运行这两个insert

b) 假设insert语句和名为
vehicle\u id
的列是唯一的,但在此之前,我检查它是否存在。如果它不存在,请继续并插入。假设代码中的两个线程同时出现。因此,它们都将进入
if
语句,因为它们发生在同一时刻

现在,它们都必须使用相同的
车辆id
进行插入。MySQL如何处理这个问题?如果是异步的或其他的,可能两个插入都发生得太快,以至于它们都会被插入,即使
vehicle\u id
与unique字段相同。如果它不是异步的或者其他什么的,一个会先被插入,第二个会等待。当一个完成后,第二个将尝试插入,但由于唯一的
车辆id
限制,它不会插入。这种情况是如何发生的


我这样问是因为
INSERT
的可重复读取中的锁失去了本质。我知道
更新/选择将如何工作。

据我所知,情况如下:

a) 为每个连接分配线程。如果两个更新都是在同一个连接上接收的,那么它们将在同一个线程中执行,一个接一个地按照接收它们的顺序执行。如果它们在不同的线程中,那么将取决于哪个线程首先被调度,从您的角度来看,这很可能是由操作系统决定的和不确定的

b) 如果列在服务器上定义为唯一,则无法插入具有相同值的第二行,因此第二次插入必须失败


试图以您描述的方式使用冲突索引似乎是应用程序逻辑问题,而不是MySQL问题。无论哪个实体负责您的唯一ID(在本例中是您的应用程序),都需要确保它们是唯一的。一种方法是使用MySQL实现应用程序锁,它允许相互隔离运行的应用程序在服务器上共享锁。请登录以了解如何使用此功能。它通常用于应用程序级,因此不绑定MySQL服务器。另一种方法是将UUID用于唯一密钥,并在需要创建新密钥时依赖其唯一性。

据我所知,情况如下:

a) 为每个连接分配线程。如果两个更新都是在同一个连接上接收的,那么它们将在同一个线程中执行,一个接一个地按照接收它们的顺序执行。如果它们在不同的线程中,那么将取决于哪个线程首先被调度,从您的角度来看,这很可能是由操作系统决定的和不确定的

b) 如果列在服务器上定义为唯一,则无法插入具有相同值的第二行,因此第二次插入必须失败


试图以您描述的方式使用冲突索引似乎是应用程序逻辑问题,而不是MySQL问题。无论哪个实体负责您的唯一ID(在本例中是您的应用程序),都需要确保它们是唯一的。一种方法是使用MySQL实现应用程序锁,它允许相互隔离运行的应用程序在服务器上共享锁。请登录以了解如何使用此功能。它通常用于应用程序级,因此不绑定MySQL服务器。另一种方法是将UUID用于唯一密钥,并在需要创建新密钥时依赖其唯一性。

先到先得!第一次尝试将锁定另一行,直到完成,第二次尝试将失败,出现约束错误。因此,在同一个表中插入两行时,另一个直到第一个才被插入?如果第一个不知道锁在什么上,那么第一个如何锁定第二个?除非单个插入将锁放在整个表上,这样,除非第一个完成插入,否则没有人可以写入数据库很聪明!它锁定存储行所需的内容,以确保一致性。请记住,这是一个正确的DBMS,而不是先到先得!第一次尝试将锁定另一行,直到完成,第二次尝试将失败,出现约束错误。因此,在同一个表中插入两行时,另一个直到第一个才被插入?如果第一个不知道锁在什么上,那么第一个如何锁定第二个?除非单个插入将锁放在整个表上,这样,除非第一个完成插入,否则没有人可以写入数据库很聪明!它锁定存储行所需的内容,以确保一致性。请记住,这是一个正确的DBMS而不是Accessb)这不是一个应用程序逻辑问题。我给mysql添加了两个插件,想知道之后会发生什么。我没有问你回答了什么。@Nika-你的问题说明了“他们都必须使用相同的车辆id进行插入。”显然,如果数据库将列定义为唯一,你就不能这样做,因此第二次插入必须失败。如果您想自己分配唯一的ID(您的问题确实表明您正在这样做),那么您的应用程序需要确保它们是唯一的。我已经解释了如何使用MySQL来允许应用程序执行您试图执行的操作。我还以为你在描述一个问题呢。我很好奇插入时锁是如何工作的。看起来,如果有一个表,我们同时进行两次插入,如果我们对其中一列使用索引,则一次插入会锁定整个表。对索引列的任何更改都将意味着