• 事务中的丢失更新


    丢失更新的定义:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将覆盖由其他事务所做的更新,这将导致数据丢失。

    典型事务序列是:

           begin Transaction;
           select col_value into :var_col_value from tableA where keyid=:keyid;
           ......

           var_col_new_value=var_col_value+1 
           update tableA set col_value=:var_col_new_value where keyid=:keyid;
           commit;

    丢失分析:

    • update更新依赖于select选定的行
    • 更新的值依赖于select的结果
    • 有多个事务存在,另外一个事务的select可能出现在:
      • 本事务的select之后,update之前
        • 如果允许读,读到的依然是var_col_value,必然发生丢失
      • 本事务的update之后,commit之前
        • 如果允许脏读,读到的是var_col_new_value,但是存在脏写,依然不安全
        • 如果允许读,但不是脏读,读到的依然是var_col_value,必然发生丢失
      • 本事务的commit之后
        • 读到的是var_col_new_value,不会丢失

    防止丢失:

    • 针对简单类型及逻辑:
      • 更改update SQL语句为累加,即
      • update tableA set col_value=col_value+1 where keyid=:keyid;
    • 不能改变SQL时,需要把select延迟到commit之后
      • 提升事务隔离级别
        • 可重复读Repeatable read
        • 可序列化Serializable
  • 相关阅读:
    找水王
    环状二维数组最大子数组和
    用户模板
    课堂作业-电梯调度
    书店折扣问题
    《软件工程》读后感
    首尾相连的二维数组最大子数组求和
    梦断代码读后感(二)
    返回一个整数数组中最大子数组的和之测试
    首尾相连的一位数组最大子数组和
  • 原文地址:https://www.cnblogs.com/sunwei2012/p/1904470.html
Copyright © 2020-2023  润新知