Experience 数据库脏读
[size=medium][color=blue]脏数据[/color][/size]
[color=blue]浏览器 应用程序+数据库[/color]
对数据库进行更新操作,除了异常之外还有更新不成功,就是条件查询的时候没有查询到数据
[color=blue]一 浏览器 应用程序[/color]
1 A和B把数据都读出来了,A对数据进行了更新并提交成功了
这个时候B看到的数据跟数据库里的不一致,但是B这个时候
也对数据进行更新,程序设计的时候应该不能让B更新成功
并给出提示信息更新失败,这个之前已经说过在表上加字段
可以解决这个问题。
1.1 上面这种情况只是对单条数据进行的操作
如果有多条数据同时更新怎么办,有的数据更新成功了,有的数据没有更新成功
例如,给一个团队分配多个用户的时候
A,B都把用户给查询出来了,A给团队p分了10个人 ,B给团队分了 20个人 有重复了
A先提交,用for循环进行更新每个人的团队状态字段
这个时候B提交会覆盖掉A的数据,所以会出现问题
怎么解决,还是用上面的方法在用户表里加lock字段更新做+1操作
由于是for循环更新不是batch更新所以可以记录哪些数据返回的是1,哪些返回的是0
返回时0的可以封装起来,返回到前台,用于显示哪些更新失败了。
如果采用这种方式,那么团队人数的数量,是更新成功之后的数量,并不是传进来的
20人就20人。
如果是batch处理的话,两处操作,那么只能返回更新成功的条数。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[color=blue]二 数据库[/color]
2 A正在更新数据,B正在读数据,两个动作同时进行
例如A正在置a1这条记录的删除状态为1,但是事物并没有提交
这个时候B正在读a1这条记录,
如果B这个时候读出了这条数据且B更新事物成功了
那么B这个时候就不应该显示出这条数据,与数据库不一致了,脏读了。
如果A回滚了还好说点,是正确的
(oracle默认的是不可提交读,就是读的是之前的数据?)
这种情况怎么处理?
这个就要用事物来进行控制了,表设计和程序是控制不了的
当B对数据进行更新的时候,应该锁定这条数据,等B更新完
事物提交或者回滚后,A才可以读出这条数据,B未提交之前A一致处在
等待状态。
具体怎么做? 看spring事物控制?
[size=medium][color=blue]脏数据[/color][/size]
[color=blue]浏览器 应用程序+数据库[/color]
对数据库进行更新操作,除了异常之外还有更新不成功,就是条件查询的时候没有查询到数据
[color=blue]一 浏览器 应用程序[/color]
1 A和B把数据都读出来了,A对数据进行了更新并提交成功了
这个时候B看到的数据跟数据库里的不一致,但是B这个时候
也对数据进行更新,程序设计的时候应该不能让B更新成功
并给出提示信息更新失败,这个之前已经说过在表上加字段
可以解决这个问题。
1.1 上面这种情况只是对单条数据进行的操作
如果有多条数据同时更新怎么办,有的数据更新成功了,有的数据没有更新成功
例如,给一个团队分配多个用户的时候
A,B都把用户给查询出来了,A给团队p分了10个人 ,B给团队分了 20个人 有重复了
A先提交,用for循环进行更新每个人的团队状态字段
这个时候B提交会覆盖掉A的数据,所以会出现问题
怎么解决,还是用上面的方法在用户表里加lock字段更新做+1操作
由于是for循环更新不是batch更新所以可以记录哪些数据返回的是1,哪些返回的是0
返回时0的可以封装起来,返回到前台,用于显示哪些更新失败了。
如果采用这种方式,那么团队人数的数量,是更新成功之后的数量,并不是传进来的
20人就20人。
如果是batch处理的话,两处操作,那么只能返回更新成功的条数。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[color=blue]二 数据库[/color]
2 A正在更新数据,B正在读数据,两个动作同时进行
例如A正在置a1这条记录的删除状态为1,但是事物并没有提交
这个时候B正在读a1这条记录,
如果B这个时候读出了这条数据且B更新事物成功了
那么B这个时候就不应该显示出这条数据,与数据库不一致了,脏读了。
如果A回滚了还好说点,是正确的
(oracle默认的是不可提交读,就是读的是之前的数据?)
这种情况怎么处理?
这个就要用事物来进行控制了,表设计和程序是控制不了的
当B对数据进行更新的时候,应该锁定这条数据,等B更新完
事物提交或者回滚后,A才可以读出这条数据,B未提交之前A一致处在
等待状态。
具体怎么做? 看spring事物控制?