数据库的脏数据?加锁? 数据库事务隔离级别和锁实现机制
2015-05-09 18:32
591 查看
参考:
http://comedsh.iteye.com/blog/698733
并发操作数据库,遇到的问题
1、丢失更新
如果两个事务都要更新数据库一个字段X,x=100
两个不同事物同时获得相同数据,然后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种情况事务A的更新就被覆盖掉了、丢失了。
2、脏读(未提交读)
防止一个事务读到另一个事务还没有提交的记录。 如:
事务读取了未提交的数据,事务B的回滚,导致了事务A的数据不一致,导致了事务A的脏读 !
3、不可重复读
一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读。
还是用上面的例子
这种情况事务A多次读取x的结果出现了不一致,即为不可重复读 。
4 幻读(Phantom Read)
事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 16 条,这种情况就叫做幻影读。
不可重复读说明了做数据库读操作的时候可能会出现的问题。
解决办法:加事物全局锁
http://comedsh.iteye.com/blog/698733
并发操作数据库,遇到的问题
1、丢失更新
如果两个事务都要更新数据库一个字段X,x=100
事务A | 事务B |
读取X=100 | 读取X=100 |
写入x=X+100 | 写入x=X+200 |
事务结束x=200 | 事务结束x=300 |
最后x=300 |
2、脏读(未提交读)
防止一个事务读到另一个事务还没有提交的记录。 如:
事务A | 事务B |
写入x=X+100 (x=200) | |
读取X=200 (读取了事务B未提交的数据) | |
事务回滚x=100 | |
事务结束x=100 | |
事务结束 |
3、不可重复读
一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读。
还是用上面的例子
事务A | 事务B |
读取X=100 | 读取X=100 |
读取X=100 | 写入x=X+100 |
事务结束, x=200 | |
读取X=200 (此时,在同一个事务A中,读取的X值发生了变化!) | |
事务结束 |
4 幻读(Phantom Read)
事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 16 条,这种情况就叫做幻影读。
不可重复读说明了做数据库读操作的时候可能会出现的问题。
解决办法:加事物全局锁
相关文章推荐
- 数据库事务隔离级别的实现-锁机制
- 数据库事务隔离级别和锁实现机制
- 数据库事务隔离级别与锁机制的实现----不是针对PostgreSQL,而是普遍的原理,来自互联网,有删节
- 数据库事务隔离级别和锁实现机制
- 数据不一致的原因,数据库三范式,事务特性,事务的四个隔离级别,数据库锁
- 事务的隔离级别通过锁机制实现
- Spring事务传播机制和数据库隔离级别
- 数据库并发机制和事务的隔离级别详解
- 数据库并发机制和事务的隔离级别详解
- Spring事务传播机制和数据库隔离级别
- 数据库事务隔离级别和锁的实现方式
- Spring事务传播机制和数据库隔离级别
- Spring事务传播机制和数据库隔离级别
- Spring事务传播机制和数据库隔离级别
- 数据库事务隔离级别
- 数据库事务的隔离级别
- 数据库事务的隔离级别
- 数据库事务隔离级别 之 学习笔记
- 关于数据库事务隔离级别的有关问题
- 关于数据库事务的隔离级别