并发思想

Oracle应用程序并发控制
并发问题描述:oracle锁机制强调并发读,非读一致,在客户生产系统中,数十用户并发操作情况下,如果应用程序没有处理并发问题,很可能出现脏数据或不正确的数据。如果处理机制不正确也容易出现性能问题。两个关键问题:
(1)分析业务并发需求。
(2)确定合适的并发处理机制。                                
介绍如下几种并发问题处理机制,应用场景需要根据实际业务并发需求进行控制。

1、利用数据库悲观锁完成并发控制
  每次对需要进行并发控制的行,进行读加更新锁。
  即select * from emp where empno=7788 for update nowait
  A事物更新前先读取要锁定的数据,B及其它事物不允许加修改锁。为了避免其它事物挂住,或引起死锁。需加nowait,或者wait 3。避免对用户造成死机现象。但错误信息不友好。可不加nowait选项,一直等待直到A事物释放锁,或捕获返回的错误信息。但一定注意应用程序逻辑,否则容易造成死锁。该方式避免应用处理冲突。
2、乐观锁定
       对关键业务建表时,增加1列,可以为版本号、或者时间戳。每次对该行的操作都提升一个版本,或者保留最后修改时间戳(精确到微妙)。需要对数据结构和处理办法进行一定的修正。可参见变通实现方法,道理十分类似。采用版本冲突,解决冲突的问题模式。
3、应用程序控制
  类似封帐问题,对关键业务加字段标示封帐标志,实现应用程序并发操作的控制。涉及时需要考虑到相关业务及影响。如更A事物操作该行之前,修改封帐标志1,再进行A事物,其它事物读取封帐状态为1时,不允许对该行数据进行操作。只有A事物处理结束,再进行解封后,其它事物才允许进行操作。
4、变通实现(也可以理解成乐观锁的一种变通处理模式)
        如果要达到update table a set s=s-1 where b=1;
  可(1)select s from a where b=1;
    (2)update table a set s=s-1 where b=1 and s=&(1)将(1)的值作为附带更新条件
    (3)更新失败,可循环1-3次程序内部重复执行上述代码,再失败返回。对客户影响较少。

        对关键业务临界值,在SQL中都需要判断临界资源
    (1)患者原始金额800
    (2)更新减少900,但约束不应该<0
    (3)更新时,程序可能会
        select sal from emp where empno=7396
                   sal此时800,实际消费800,可以进行扣款操作
        update emp set sal=sal-800 where empno=7396 and sal-800>0(避免其它事物已经扣除800元,仍然满足执行条件)或者第一步select sal from emp where empno=7396可以不执行。均在update时执行,因为患者仍可能同时在交款,
刚开始不足,同时也在交款,先不考虑实际可性行,仅从程序角度出发。
        这方法只适用于部分业务。即有临界资源的业务
   (4)更新失败,可循环1-3次程序内部重复执行上述代码,再失败返回。对客户影响较少。


5、数据结构控制
  表结构建立约束控制,如库存不能小于0,当更新导致列值不满足条件时,返回数据库错误信息。也较不友好。但这不是处理并发的解决办法。




转于 itpub

zhangqi0718,表示感谢!


你可能感兴趣的:(数据库并发)