我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!
解决方案 »
- 急!!!改ip后,出现协议适配器不可加载的错误,但是配置文件使用的是host名,不解为什么会出现这个错误,请高人解答
- 牛人進oracle全文檢索問題
- 【求指教】PL/SQL 里边的sql语句不能执行。不明原因
- 如何用ODP.net(Oracle.DataAccess.Client非System.Data.OracleClient)生成类型化的DataSet?
- oracel竖表变横表的问题
- 怎么使用ORACLE的控制台???
- 关于isnull函数
- 怎样将一个关键字设置成表的字段?
- Oracle 8 与 8i功能上有何区别
- oracle 设置字段的问题
- (急)如何对一个对象的一个字段插入一个序列的值?
- oracle 在语句中用正则有几种写法?
同意,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
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;
这样会不会引起死锁啊,如果多人操作的话
不会, 对于同一张表,当一个用户在更新时,这个表就被锁住了,其他用户就无法对表进行更新操作, 直到用户更新完成,释放了锁之后,其他用户才可以进行更新。 这个就是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
这时就产生锁失效,所以,必须手动处理并发问题。例如,A 账户有 200元,我在表上加一个字段,ISLocked=0 没锁,ISLocked=1加了锁 ,我首先把字段加锁,然后查询,然后取出现金余额值到应用程序,然后修改数据。表面上,没问题,如果是高并发,100个同时查询,可能就会出现,查询的时候都没锁,然后依次去加锁(更新ISLocked=1)
同时去更新表的 200元解决这个问题应该是 更新的时候这么更新,update 表 set ISlocked=1 where ISLocked=0
这样仿佛可以避免最直接的办法是 加行锁,但是这样对于应用程序,会产生严重错误
不要太相信 数据库,不要太相信权威,自己动手看看小规模并发,大规模并发,完全是2回事,你自己用几十行数据模拟一下就得到的结论,太片面
往往要接触到才体会到
你懂什么?利用字段加锁,又不是oracle默认的加锁!你这个加了个字段的,任何数据库都行!手工加锁出问题能怪数据库???自己把锁的概念搞错了,还怪人家有星的说的不对????我没星,只是就事论事。