社区
Oracle
帖子详情
oracle并发处理SOS
mingjianzeng2003
2009-12-09 03:27:27
我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
...全文
184
10
打赏
收藏
oracle并发处理SOS
我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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对并行处理已经很成熟了
oracle
处理
多
并发
,
oracle
并发
处理
SOS
-
Oracle
/ 开发
oracle
并发
处理
SOS
-
Oracle
/ 开发我在开发的这个应用
并发
性比较高,
oracle
更新数据时候如何
处理
并发
处理
呢?各位大侠发表好的观点啊,在线等待!
oracle
数据更新时,会自动默认行锁定,楼主不要操心,
Oracle
对并行...
放心!
Oracle
中currval()的返回值并不会因为nextval()的
并发
访问而混乱
http://www.cnblogs.com/
sos
-blue/p/4897515.html 想取得刚才nextval()的值时,放心大胆的用currval()吧! 以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值; 因为可能...
SOS
调试扩展 (
SOS
.dll) 《第五篇》
一、
SOS
扩展命令
SOS
包含几十个命令,要熟练使用
SOS
,首先要了解
SOS
有哪些命令。下面给出
SOS
命令列表。命令描述BPMD[<module name> <method name>] [-md<MethodDesc>]建立一个断点在指定模块的...
oracle
序列 current 与 nextval
原文地址:http://www.cnblogs.com/
sos
-blue/p/4897515.html ...因为可能其他线程
并发
访问nextval()。 先说结论吧: 当你拿到一个数据库连接,先nextval(), 然后无论其他再怎么操作这个sequence,你用current()取得
oracle
存储过程 示例
create or replace procedure sp_
sos
oad_common(p_day in number) is v_Program_Name Varchar2(30) := '
SOS
OAD'; v_srctable Varchar2(30) := 'bu.t_dw_
sos
oad_qv' ...v_tableowner Varchar2(30) := 'U_OBU_
SOS
Oracle
17,086
社区成员
55,238
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章