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官方文档贴出来。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值