社区
Oracle
帖子详情
oracle并发处理SOS
mingjianzeng2003
2009-12-09 03:27:27
我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
...全文
191
10
打赏
收藏
oracle并发处理SOS
我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
数据更新时,会自动默认行锁定,楼主不要操心,
Oracle
对并行
处理
已经很成熟了同意,
Oracle
会自己解决这些问题,我们只需要通...
放心!
Oracle
中currval()的返回值并不会因为nextval()的
并发
访问而混乱
想取得刚才nextval()的值时,放心大胆的用currval()吧!
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 以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值; 因为可能其他线程
并发
访问nextval()。 先说结论吧: 当你拿到一个数据库连接,先nextval(), 然后无论其他再怎么操作这个sequence,你用current()取得
深入浅出解析mssql在高频,高
并发
访问时键查找死锁问题
SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁。希望对您学习SQL Server死锁方面能有所帮助。 死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高
并发
查询下由于数据库设计的潜在问题,一些不...
Oracle
17,140
社区成员
55,259
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章