楼主: neozhu

[PL/SQL] 自定义自增序列的并发问题怎么解决

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
11#
发表于 2017-2-27 09:49 | 只看该作者
neozhu 发表于 2017-2-27 09:48
没看懂,如果用oracle自带的序列肯定没问题,但业务需要根据前缀从1开始,所以需要自己写

那就'1'||to_number(seq)

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
12#
 楼主| 发表于 2017-2-27 09:50 | 只看该作者
sse_zero 发表于 2017-2-27 09:44
唯一索引不能解决,数据不对问题?

这样会抛异常,用户体验不好,最好在源头解决。另外你觉得这样写会不会出现死锁的可能

使用道具 举报

回复
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
13#
发表于 2017-2-27 09:53 | 只看该作者
merge 和 insert into select 不支持 returning,真是不爽;

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
14#
 楼主| 发表于 2017-2-27 10:02 | 只看该作者
wmxcn2000 发表于 2017-2-27 09:53
merge 和 insert into select 不支持 returning,真是不爽;

还有没有其他好的解决方案

使用道具 举报

回复
论坛徽章:
72
秀才
日期:2019-05-24 13:29:27秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:01:25秀才
日期:2018-12-05 13:58:28秀才
日期:2018-12-05 13:52:27秀才
日期:2018-11-13 15:18:40秀才
日期:2018-11-13 15:18:40秀才
日期:2018-11-13 15:18:40
15#
发表于 2017-2-27 10:36 | 只看该作者
neozhu 发表于 2017-2-27 09:50
这样会抛异常,用户体验不好,最好在源头解决。另外你觉得这样写会不会出现死锁的可能

就目前你的写法,我觉得会。你觉着呢?

使用道具 举报

回复
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
16#
发表于 2017-2-27 11:02 | 只看该作者
neozhu 发表于 2017-2-27 10:02
还有没有其他好的解决方案

我都这样干:
假定从 1 开始,我会先写入一个从 0 开始的记录,防并且的效果还是不错的,你可以参考一下:
-- 这是表结构
create table t(id int, num int);
-- 写入 0 的记录
insert into t select 100, 0 from dual where not exists(select * from t where  id = 100)
-- 生成序列( 1、2、3、4、5) 的记录
update t set num = num + 1 where id = 100 returning num into v_num;

欢迎大家指点!
如果 merge 有 returning ,就爽了。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
17#
 楼主| 发表于 2017-2-27 11:08 | 只看该作者
wmxcn2000 发表于 2017-2-27 11:02
我都这样干:
假定从 1 开始,我会先写入一个从 0 开始的记录,防并且的效果还是不错的,你可以参考一下 ...

这样写是不是也有可能拿到相同的号

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
18#
发表于 2017-2-27 11:08 | 只看该作者
wmxcn2000 发表于 2017-2-27 11:02
我都这样干:
假定从 1 开始,我会先写入一个从 0 开始的记录,防并且的效果还是不错的,你可以参考一下 ...

并发测试一下

使用道具 举报

回复
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
19#
发表于 2017-2-27 11:11 | 只看该作者
neozhu 发表于 2017-2-27 11:08
这样写是不是也有可能拿到相同的号

id 列和 num 列加了唯一索引了,不会重复插入的;

使用道具 举报

回复
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
20#
发表于 2017-2-27 11:14 | 只看该作者

〇〇 大师好,忘说了句了, id 列和 num 加了联合的唯一索引,所以 0 这条记录,只插入一条;如果没有恰好两个会话同时来了,一个会有锁排队的;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表