事务中的丢失更新
2010-12-13 14:31
148 查看
丢失更新的定义:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将覆盖由其他事务所做的更新,这将导致数据丢失。
典型事务序列是:
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
典型事务序列是:
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
相关文章推荐
- 一个事务复制的bug--更新丢失 续
- Spring中事务的(特性,传播行为,隔离级别,不合理现象,丢失更新,案例..)
- Spring 五个事务隔离级别和七个事务传播行为和数据读取出现的四个问题(丢失或覆盖更新、脏读、非重复读、幻想读)
- 关于事务 --- 丢失更新
- 并发数据库事务缺锁导致的数据不一致情况:丢失更新,脏读,不可重复读,幻读
- 事务概念以及更新丢失的解决
- spring事务的更新丢失
- 数据库事务的ACID隔离级中P0(脏写)和P4(更新丢失)的区别
- 关于事务和丢失更新
- 事务丢失更新的解决方案
- 事务的概念和丢失更新的解决方式
- Spring事务的更新丢失
- 一个事务复制的bug--更新丢失
- SqlServer 可更新订阅升级字段队列数据丢失原因
- 数据更新、事务处理、数据伪列
- Hibernate的学习之路十五(丢失更新问题)
- Codeigniter框架的更新事务(transaction)BUG及解决方法
- SQL语言多表查询、分组统计、子查询、数据表的更新操作、事务处理
- entity framework 新增,更新,事务