免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8666 | 回复: 14

sybase iq中的并发执行insert [复制链接]

论坛徽章:
0
发表于 2009-02-05 21:06 |显示全部楼层
5可用积分
在sybase iq下开发C嵌入式,
我执行多个并发任务,每个任务一开始要往日志里面插入日志记录, 几乎是同一时间执行这些日志插入,
结果每次都有产生死锁的问题, 返回码为 -21

于是在插入的时候加了一段代码

if(sqlca.sqlcode == -21)
{
       sleep(1)
       goto 到插入语句;
}

结果几个任务程序同时停留在 sleep状态
绝望了!!

论坛徽章:
0
发表于 2009-02-05 22:50 |显示全部楼层
是不是某进程没有commit,导致其hold住锁不放呢?
此外,尽量不要挑战IQ的并发性与insert,这是IQ的短板之一,如果可以忍受,那就没问题了。

论坛徽章:
0
发表于 2009-02-06 08:43 |显示全部楼层
我每个进程在执行下面判断代码之后,
if(sqlca.sqlcode == -21)
{
       sleep(1)
       goto 到插入语句;
}
都有  commit

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2009-02-06 09:17 |显示全部楼层
有一次问过一次Sybase的人,对IQ不推荐使用这种方法插数据,还是load比较好。
另外似乎iq的锁机制并不会导致像你说的这种情况,直接使用几个dbisql连进去试试,看是否锁

论坛徽章:
0
发表于 2009-02-06 09:42 |显示全部楼层
请问像我这种情况,怎么能避免, 如果不能解决后台并行插日志的问题,
并行任务,就无法进行实时监控了,
请指教一下!

论坛徽章:
0
发表于 2009-02-06 09:44 |显示全部楼层
感觉人为的用disql制造这种并行很难,用程序直接fork进程,进行同时插入,
产生的机率要大的多

论坛徽章:
0
发表于 2009-02-06 11:04 |显示全部楼层

回复 #3 xgwx 的帖子

根据你的描述,从理论上来说,是不会发生这种情况的。
你可以在多个进程不响应的时候,登录进入IQ,看看系统中的锁与事务,也许就知道堵在哪里了。

论坛徽章:
0
发表于 2009-02-06 11:11 |显示全部楼层
不过并发插入数据、并发加载数据(同表)确实是IQ的弱项,尽量不要这么做,是否可以考虑将日志写在外部文件中呢?

论坛徽章:
0
发表于 2009-02-06 17:52 |显示全部楼层
强烈建议,日志首先写入一个队列,定期从队列写入。

论坛徽章:
0
发表于 2009-02-06 18:07 |显示全部楼层
写队列这个办法真的不错,谢谢大家关注!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP