ORA-00001: 违反唯一约束条件

Posted bluss-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORA-00001: 违反唯一约束条件相关的知识,希望对你有一定的参考价值。

       我用的是oracle的sequences,批量插入数据主键id取的是sequences.nexval。但是服务器后台一直报主键唯一约束错误。

问了DBA说是数据库 RAC(Real Application Clusters)集群部署方案。说序列生成的主键肯定不会重复(存在疑惑),理论上某个服务器宕机还是会存在重复的(待确认,还没有遇到)。

      1.避免使用sequences.nexval+1

       2.如果数据量比较大,可以改cache值大一点(系统压力,响应速度方面考虑)

       3.查询主键ID最大值(max(id))与sequences的next number比较   理论上需要next number>sequences.id,如果不是那可能就会报唯一约束问题

出现问题按上面的三步骤进行排查。大部分问题都会解决。

具体事务的介绍可以看下这个博客

https://www.cnblogs.com/CandiceW/p/10062413.html

:最近在讨论某系统和一个外系统做全局事务的事情,本想用这个主键作为两系统传输的一部分,用于控制全局事务,且用其作为判断交易先后顺序的依据,这是不太符合要求的,因为是RAC,序列是基于实例级cache,那么如果不能保证某一类型的交易总在一个节点上执行,那么不同次交易产生的主键序列值可能不是递增的,例如节点1处理一次交易,产生序列是1,节点2处理一次交易,产生序列是21,此时节点1再处理一次交易,产生序列是2;除非设置序列为order,但这样在RAC就有可能产生资源争用的问题,因为为了保证多节点间每次产生的序列值是递增的,每次产生就需要多节点间判断当前值后,才能知道下一个值是多少,而且会有额外的锁,保证同一时间只有一个节点在做这个操作,当然究竟是否会产生资源争用,还是要依据实际的业务并发量,或者压力测试才能证明,这里只是说可能会这样的问题,不是一定会,否则Oracle就不会有提供这种order的创建属性,凡事不绝对。

欢迎大家把有关于sequences的oracle官方文档贴出来。

 

 

以上是关于ORA-00001: 违反唯一约束条件的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00001: 违反唯一约束条件

“ORA-00001:违反了唯一约束”,即使使用异常

java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011456)

Hibernate 两次将数据插入到 Join Table 中,导致 Spring Boot 项目中出现“ORA-00001:违反唯一约束”

ORA-00001:违反了唯一约束(MYUSER.ADI_PK)

Oracle Standard Error 列表