当前位置: 首页 > 面试题库 >

如何锁定尚不存在的InnoDB行?

戚侯林
2023-03-14
问题内容

如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而SELECTand INSERT语句之间没有任何截距?

几乎就像我锁在不存在的行上。我想用用户名 “ Foo”
锁定不存在的行,以便现在可以检查数据库中是否存在该行,并将其插入数据库(如果尚不存在的话)将其插入数据库。

我知道使用LOCK IN SHARE MODEFOR UPDATE存在,但据我所知,仅适用于已经存在的行。我不确定在这种情况下该怎么办。


问题答案:

如果存在索引username(应该是索引,如果没有,则添加一个,最好是UNIQUE一个),那么发出a SELECT * FROM user_table WHERE username = 'foo' FOR UPDATE;将阻止任何并发事务创建该用户(以及“上一个”和“下一个”索引不唯一时的可能值)。

如果找不到 合适的 索引(满足WHERE条件),则不可能进行有效的记录锁定,并且整个表都将被锁定*。

该锁将一直保持到发出的交易结束SELECT ... FOR UPDATE

在这些手册页中可以找到关于此主题的一些非常有趣的信息。

  • 我说有 效率,因为实际上记录锁定实际上是对索引记录的锁定。如果找不到 合适的 索引,则只能使用默认的聚集索引,并且它将被完全锁定。


 类似资料:
  • 问题内容: 如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而and 语句之间没有任何截距? 几乎就像我锁在不存在的行上。我想用用户名 “ Foo” 锁定不存在的行,以便现在可以检查数据库中是否存在该行,并将其插入数据库(如果尚不存在的话)将其插入数据库。 我知道使用和存在,但据我所知,仅适用于已经存在的行。我不确定在这种情况下该怎么办。 问题答案: 如果存在索引(应

  • 我有一个数据库(postgresql)与表Cdr。每个月都会在数据库中创建一个新表,该表具有与Table Cdr相同的模式,名为Cdr__(例如。Cdr_2016_04)。 我试图使用Jooq查询数据库,基于提供的日期。麻烦的是: 不起作用,因为它表明 组织。约克。例外DataAccessException:。。。来自cdr_2017_01,其中“公共”、“cdr”、“field1”和“公共”、“

  • 问题内容: 我正在尝试创建表(如果尚不存在)。我目前正在检查它是否首先存在,并且该查询是否不返回任何内容,然后插入。有没有一种方法可以只检查同一条语句,因此我不必将其分解为单独的查询? 这就是我目前所拥有的。 这是我要的东西。 问题是,您不能在语句中添加一个。 问题答案: 是的,Oracle没有该功能真是可惜。我敢肯定会有一天。在此之前,如果您想编写一个PL / SQL包装器,为什么不那样做:

  • 主要内容:1.磁盘or内存,2.数据页,3.用户记录,4.最大和最小记录,5.页目录,6.文件头部和尾部,7.页头部,8.总结innodb底层是如何存储数据的 1.磁盘or内存 1.1 磁盘 数据对系统来说是非常重要的东西,比如:用户的身份证、手机号、银行号、会员过期时间、积分等等。一旦丢失,会对用户造成很大的影响。 把数据存在磁盘上。 但是IO请求是比较耗时的操作,如果频繁的进行IO请求势必会影响数据库的性能。 1.2 内存 内存可以存储一些用户数据,但无法存储所有的用户数据,因为如果数据量太

  • 问题内容: 我有两个innodb表: 文章 票数 将新记录插入表中时,我想通过计算所有投票的总和来更新表中的字段。 如果SUM()计算本身非常繁琐(表有700K条记录),则哪种方法更有效。 1.创建触发器 2.在我的应用程序中使用两个查询 第一种方法看起来更干净,但是 在整个SELECT查询运行期间,表是否将被锁定? 问题答案: 关于并发问题,您有一种 “简便”的 方法来防止第二种方法中的任何并发

  • 本文向大家介绍详解MySQL(InnoDB)是如何处理死锁的,包括了详解MySQL(InnoDB)是如何处理死锁的的使用技巧和注意事项,需要的朋友参考一下 一、什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。 这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。 二、为什么会形成死锁 看到这里,也许你会有这样