如何在唯一索引上产生4号锁

当两个会话同时插入(主键相同)同一行,产生阻塞等待

会话1上操作

SQL> select sid from v$mystat where rownum=1;

      SID

----------

        1

SQL> create table tt(id int primary key);

Table created.

SQL> insert into tt values(1);

1 row created.

会话2上操作

SQL> select sid from v$mystat where rownum=1;

      SID

----------

       49

SQL> insert into tt values(1);

这里被阻塞了

会话3上操作:

SQL> select * from v$lock where sid in(1,49);

ADDR             KADDR                        SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

---------------- ----------------         ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

000000007A512E60 000000007A512EB8         49 TX      65548       2336          0          4          5          0

00002AF62EBFF408 00002AF62EBFF468         49 TM      77367          0          3          0         83          0

00002AF62EBFF408 00002AF62EBFF468          1 TM      77367          0          3          0          8          0

0000000078DEA600 0000000078DEA678         49 TX     655373       2357          6          0          5          0

0000000078E67490 0000000078E67508          1 TX      65548       2336          6          0          8          1

这里确实有个请求4号锁:

把TX上的id1=65548转化成undo

SQL> select trunc(65548/power(2,16)) as undo_blk#,bitand(65548,to_number('ffff','xxxx')) + 0 as slot# from dual;

UNDO_BLK#      SLOT#

---------- ----------

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

        1         12

会话4上操作:

SQL> select * from v$transaction;

ADDR                 XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS           START_TIME     START_SCNB START_SCNW START_UEXT START_UBAFIL START_UBABLK START_UBASQN START_UBAREC SES_ADDR        FLAG SPA REC NOU PTX NAME                                                                                               PRV_XIDUSN PRV_XIDSLT PRV_XIDSQN PTX_XIDUSN PTX_XIDSLT PTX_XIDSQN     DSCN-B     DSCN-W  USED_UBLK  USED_URELOG_IO      PHY_IO     CR_GET  CR_CHANGE START_DAT  DSCN_BASE  DSCN_WRAP  START_SCN DEPENDENT_SCN XID              PRV_XID    PTX_XID

---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ---------- ---------- ------------ ------------ ------------ ------------ ---------------- ---------- --- --- --- --- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- ---------- ---------- ------------- ---------------- ---------------- ----------------

0000000078DEA600         10         13       2357          3       2429        229          1 ACTIVE           12/19/12 20:44:58       5631705            0          3            3         2429          229            1 000000007AF97D68 3587 NO  NO  NO  NO                                                                                             0   0          0          0          0          0          0          0          1          1         18      8           2 19-DEC-12          0          0    5631705             0 0A000D0035090000 0000000000000000 0000000000000000

0000000078E67490          1         12       2336          3       3539        448         43 ACTIVE           12/19/12 20:46:13       5631693            0          2            3         3539          448           42 000000007A85DB50 3587 NO  NO  NO  NO                                                                                             0   0          0          0          0          0          0          0          1          2          7      1           0 19-DEC-12          0          0    5631693             0 01000C0020090000 0000000000000000 0000000000000000

时间: 2024-10-27 00:09:05

如何在唯一索引上产生4号锁的相关文章

MongoDB 唯一索引

MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等.同时索引的属性可以具有唯一性,即唯一索引.唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性.缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引.本文主要描述唯一索引的用法. 一.创建唯一索引语法 //语法 db.collection.createIndex( <key and index type specification>, { unique:

并发操作-a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊

问题描述 a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊 a,b同时查询表,结果是可以注册的,所以都执行了insert,但用户名相同,这样数据就不唯一了.是会这样吗,如何避免呢? 解决方案 把查询和插入放在同一事务中,可以保证整个事务中数据库数据的一致性,这样应该可以避免你说的问题. 上述并发一起的问题,根源在于查询与插入两个时间点数据库数据不一致导致. 解决方案二: 必须有有个不同的key,比如你可以增加一个字段,为userid,这个不会变,但用户名可以

MySQL批量插入遇上唯一索引避免方法_Mysql

一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战. 今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL: 这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么办法可以避免?它对性能的影响有多大? 二.过程 (一) 导入差异数据,忽略重

索引键的唯一性(3/4):唯一聚集索引上的唯一和非唯一非聚集索引

原文:索引键的唯一性(3/4):唯一聚集索引上的唯一和非唯一非聚集索引 在上篇文章里,我讨论了唯一和非唯一聚集索引的区别.我们已经知道,SQL Server内部使用4 bytes的uniquifier来保证非唯一聚集索引行唯一.今天我们来看下唯一聚集索引上,唯一和非唯一非聚集索引的区别.当我们在表上定义PRIMARY KEY约束时,SQL Server会为我们创建唯一聚集索引:另外我们可以通过CREATE UNIQUE CLUSTERED INDEX语句在表上创建唯一聚集索引.下面的代码会创建c

索引键的唯一性(4/4):非唯一聚集索引上的唯一和非唯一非聚集索引

原文:索引键的唯一性(4/4):非唯一聚集索引上的唯一和非唯一非聚集索引 在上一篇文章里,我谈了唯一聚集索引上的唯一和非唯一非聚集索引的区别.在这篇文章里,我想谈下非唯一聚集索引上的唯一和非唯一聚集索引的区别.我们都知道,SQL Server内部把非唯一聚集索引当作唯一聚集索引处理的.如果你定义了一个非唯一聚集索引,SQL Server会增加叫做uniquifier到你的索引记录,它导致你聚集索引的导航结构(B树的非叶子层)里,每条索引行都要用到4 bytes的开销. 下列代码再次创建我们的Cu

MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划_MongoDB

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

SQL Server已分区索引的特殊指导原则(2)- 唯一索引分区

一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的交流. 二.解读 [对唯一索引进行分区] "对唯一索引(聚集或非聚集)进行分区时,必须从唯一索引键使用的分区依据列中选择分区依据列.此限制将使 SQL Server 只调查单个分区,以确保表中不存在重复的新键值.如果分区依据列不可能包含在唯一键中,则必须使用 DML 触发器,而不是强制实现唯一性.&

mysql中如何查看和删除唯一索引

  mysql中如何查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果如下: 查询到唯一索引后,如何删除唯一索引呢,使用如下命令: alter table mytable drop index mdl_tag_use_ix;//mdl_tag_use_ix是上表查出的索引名,key_name

MySQL建立唯一索引实现插入重复自动更新_Mysql

前言 在我们往数据库插入数据的时候,需要判断某个字段是否存在,如果存在则执行更新操作,如果不存在则执行插入操作,如果每次首先查询一次判断是否存在,再执行插入或者更新操作,就十分不方便.下面给大家分享个方法,方便大家实现这一功能,下面来一起看看吧. ON DUPLICATE KEY UPDATE 这个时候可以给这个字段(或者几个字段)建立唯一索引,同时使用以下 sql 语句进行插入或更新操作: INSERT INTO table (id, user_id, token) VALUES (NULL,