oracle并发处理SOS

mingjianzeng2003 2009-12-09 03:27:27
我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazylaa 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bbwolfcool 的回复:]
另外,我也想到,用事务去处理,但是这又是并发事务,我开始用MS SQL,直接报错,发生锁死

ORacle没出错,但是还是有问题

事务按道理是 原子性的,加了锁不应该给别的事务再加锁,事实相反


不要太相信 数据库,不要太相信权威,自己动手看看

小规模并发,大规模并发,完全是2回事,你自己用几十行数据模拟一下就得到的结论,太片面


往往要接触到才体会到
[/Quote]

如果你是查来的,可以原谅,如果是你真的这么认为,那么,对不起,你错了!
crazylaa 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bbwolfcool 的回复:]
楼上打红星的也不咋样嘛,

分情况不同,会锁,我还在找资料。

有一种情况会产生 并发锁失效。

取出你要的一行数据准备处理,取出以后,进行复杂处理,可能100-1000毫秒左右,再去更新
这时就产生锁失效,所以,必须手动处理并发问题。

例如,A 账户有 200元,我在表上加一个字段,ISLocked=0 没锁,ISLocked=1加了锁 ,我首先把字段加锁,然后查询,然后取出现金余额值到应用程序,然后修改数据。

表面上,没问题,如果是高并发,100个同时查询,可能就会出现,查询的时候都没锁,然后依次去加锁(更新ISLocked=1)
同时去更新表的 200元

解决这个问题应该是 更新的时候这么更新,update 表 set ISlocked=1 where ISLocked=0
这样仿佛可以避免

最直接的办法是 加行锁,但是这样对于应用程序,会产生严重错误
[/Quote]

你懂什么?利用字段加锁,又不是oracle默认的加锁!你这个加了个字段的,任何数据库都行!手工加锁出问题能怪数据库???自己把锁的概念搞错了,还怪人家有星的说的不对????我没星,只是就事论事。
bbwolfcool 2009-12-30
  • 打赏
  • 举报
回复
另外,我也想到,用事务去处理,但是这又是并发事务,我开始用MS SQL,直接报错,发生锁死

ORacle没出错,但是还是有问题

事务按道理是 原子性的,加了锁不应该给别的事务再加锁,事实相反


不要太相信 数据库,不要太相信权威,自己动手看看

小规模并发,大规模并发,完全是2回事,你自己用几十行数据模拟一下就得到的结论,太片面


往往要接触到才体会到
bbwolfcool 2009-12-30
  • 打赏
  • 举报
回复
楼上打红星的也不咋样嘛,

分情况不同,会锁,我还在找资料。

有一种情况会产生 并发锁失效。

取出你要的一行数据准备处理,取出以后,进行复杂处理,可能100-1000毫秒左右,再去更新
这时就产生锁失效,所以,必须手动处理并发问题。

例如,A 账户有 200元,我在表上加一个字段,ISLocked=0 没锁,ISLocked=1加了锁 ,我首先把字段加锁,然后查询,然后取出现金余额值到应用程序,然后修改数据。

表面上,没问题,如果是高并发,100个同时查询,可能就会出现,查询的时候都没锁,然后依次去加锁(更新ISLocked=1)
同时去更新表的 200元

解决这个问题应该是 更新的时候这么更新,update 表 set ISlocked=1 where ISLocked=0
这样仿佛可以避免

最直接的办法是 加行锁,但是这样对于应用程序,会产生严重错误
lixinbill 2009-12-09
  • 打赏
  • 举报
回复
楼主有点多虑了,强大的ORACLE有内锁机制,不用我们去处理了。
crazylaa 2009-12-09
  • 打赏
  • 举报
回复
楼主的PKGGONGGONGJC.USF_GETDATE如果取到的只是年月日时分,LR_DENGJIK表又不是DENGJIBH作为主键的话,有插入重复DENGJIBH 的危险。
Dave 2009-12-09
  • 打赏
  • 举报
回复

不会, 对于同一张表,当一个用户在更新时,这个表就被锁住了,其他用户就无法对表进行更新操作, 直到用户更新完成,释放了锁之后,其他用户才可以进行更新。 这个就是Oracle 内部的锁机制..

楼主可以看下我的blog:
ORACLE 锁机制

http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4696896.aspx

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

。。。。。。




------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
mingjianzeng2003 2009-12-09
  • 打赏
  • 举报
回复
PROCEDURE USP_S_LR_DENGJIK(DENGJIBH_IN IN LR_DENGJIK.DENGJIBH%TYPE,
GERENBH_IN IN LR_DENGJIK.GERENBH%TYPE,
JUMINBH_IN IN LR_DENGJIK.JUMINBH%TYPE,
JUZHULX_IN IN LR_DENGJIK.JUZHULX%TYPE,
LIANXIR_IN IN LR_DENGJIK.LIANXIR%TYPE,
LIANXIDH_IN IN LR_DENGJIK.LIANXIDH%TYPE,
LAONIANZ_IN IN LR_DENGJIK.LAONIANZ%TYPE,
SHENGHUOSY_IN IN LR_DENGJIK.SHENGHUOSY%TYPE,
ZILINL_IN IN LR_DENGJIK.ZILINL%TYPE,
HULIQK_IN IN LR_DENGJIK.HULIQK%TYPE,
JIANGUAN_IN IN LR_DENGJIK.JIANGUAN%TYPE,
DENGJIR_IN IN LR_DENGJIK.DENGJIR%TYPE,
DENGJIRQ_IN IN VARCHAR2 /*日期类型,需要用TO_DATE转换*/,
BEIZHU_IN IN LR_DENGJIK.BEIZHU%TYPE,
TIANBIAOR_IN IN LR_DENGJIK.TIANBIAOR%TYPE,
TIANBIAORQ_IN IN VARCHAR2 /*日期类型,需要用TO_DATE转换*/,
YONGHUBH1_IN IN LR_DENGJIK.YONGHUBH1%TYPE,
FUWUJGBH_IN IN LR_DENGJIK.FUWUJGBH%TYPE,
BIANHAO_IN IN VARCHAR2,
ZHUJIANZ_OUT OUT VARCHAR2,
APPCODE_OUT OUT NUMBER,
DATABUFFER_OUT OUT VARCHAR2) IS
V_CNT NUMBER(1);
V_DENGJIBH LR_DENGJIK.DENGJIBH%TYPE := DENGJIBH_IN;
BEGIN
APPCODE_OUT := '0';
DATABUFFER_OUT := '成功';
/*判断基础表中有无记录*/
BEGIN
SELECT COUNT(*)
INTO V_CNT
FROM DUAL
WHERE EXISTS (SELECT 1 FROM LR_DENGJIK WHERE DENGJIBH = V_DENGJIBH);
EXCEPTION
WHEN OTHERS THEN
APPCODE_OUT := '-1';
DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
RETURN;
END;
IF V_CNT = 0 THEN
BEGIN
/*生成主键*/
IF BIANHAO_IN IS NULL THEN
APPCODE_OUT := '-1';
DATABUFFER_OUT := '编号不能为空!';
RETURN;
ELSE
V_DENGJIBH := BIANHAO_IN || PKGGONGGONGJC.USF_GETDATE;
ZHUJIANZ_OUT := V_DENGJIBH;
END IF; /*插入记录*/
INSERT INTO LR_DENGJIK
(DENGJIBH,
GERENBH,
JUMINBH,
JUZHULX,
LIANXIR,
LIANXIDH,
LAONIANZ,
SHENGHUOSY,
ZILINL,
HULIQK,
JIANGUAN,
DENGJIR,
DENGJIRQ,
BEIZHU,
TIANBIAOR,
TIANBIAORQ,
YONGHUBH1,
FUWUJGBH)
VALUES
(V_DENGJIBH,
GERENBH_IN,
JUMINBH_IN,
JUZHULX_IN,
LIANXIR_IN,
LIANXIDH_IN,
LAONIANZ_IN,
SHENGHUOSY_IN,
ZILINL_IN,
HULIQK_IN,
JIANGUAN_IN,
DENGJIR_IN,
TO_DATE(DENGJIRQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
BEIZHU_IN,
TIANBIAOR_IN,
TO_DATE(TIANBIAORQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
YONGHUBH1_IN,
FUWUJGBH_IN);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
APPCODE_OUT := '-1';
DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
RETURN;
END;
ELSE
BEGIN
/*更新记录*/
UPDATE LR_DENGJIK
SET GERENBH = GERENBH_IN,
JUMINBH = JUMINBH_IN,
JUZHULX = JUZHULX_IN,
LIANXIR = LIANXIR_IN,
LIANXIDH = LIANXIDH_IN,
LAONIANZ = LAONIANZ_IN,
SHENGHUOSY = SHENGHUOSY_IN,
ZILINL = ZILINL_IN,
HULIQK = HULIQK_IN,
JIANGUAN = JIANGUAN_IN,
DENGJIR = DENGJIR_IN,
DENGJIRQ = TO_DATE(DENGJIRQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
BEIZHU = BEIZHU_IN,
XIUGAIRQ = TO_DATE(TIANBIAORQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
YONGHUBH2 = YONGHUBH1_IN,
FUWUJGBH = FUWUJGBH_IN
WHERE DENGJIBH = V_DENGJIBH;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
APPCODE_OUT := '-1';
DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
RETURN;
END;
END IF;
COMMIT;
END USP_S_LR_DENGJIK;


这样会不会引起死锁啊,如果多人操作的话
Dave 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ojuju10 的回复:]
oracle数据更新时,会自动默认行锁定,楼主不要操心,Oracle对并行处理已经很成熟了
[/Quote]

同意,Oracle 会自己解决这些问题,我们只需要通过SQL 命令来操作就可以了..






------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
ojuju10 2009-12-09
  • 打赏
  • 举报
回复
oracle数据更新时,会自动默认行锁定,楼主不要操心,Oracle对并行处理已经很成熟了

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧