`
沙漠魚
  • 浏览: 39764 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

事务的隔离级别

阅读更多
什么是脏读:
Step1: 应用A从RDBMS读取了整数X, 此时X=0
Step2: 将10赋值给X,并保存到数据库中X=10,此时数据库还没完成数据库的事务提交操作。
Step3: 应用B从RDBMS读取X, 此时读到的X值为10
Step4: 应用A放弃了提交,因此它将数据库中的X恢复为0。
Step5: 应用B将15加给X,并保存到RDBMS,此时X=25
这种读取到未提交的数据称之为脏读(Dirty Read).

什么是Unrepeatable(不可重复读):
Step1: 从RDBMS读取X
Step2: 另一应用使用新的X值覆盖了RDBMS中的X
Step3:当再次从RDBMS读取X时,发现数据被改动了。

什么是Phantom(幻读):
? Step1: 应用查询RDBMS,返回相应的数据集合
? Step2: 另一应用插入新的数据到RDBMS中
? Step3: 当再次执行查询操作时,新的数据出现在返回结果中。

Unrepeatable Read 和 Phantom 的区别可能是Unrepeateable Read加的行级锁,Phantom是对整个表加锁。

设置合适数据库的事务隔离级别防止上述问题发生:
1Read Uncommited: 将会出现脏读问题。如果不存在并发事务,且只有单个实例处于运行中,则
? ? ? ? ? ? ? ? ? ? 比较适合。
2Read commited: 能解决脏读问题,适用于只需要从RDMBS中读取数据的应用,但不能解决不可
? ? 重复读。Oracle, SQL Server 默认的级别。
3Repeatable Read: 解决Drity Read和Unrepeatable问题。
? ? 可以用"乐观锁"达到同样目的。
4Serializable:
? ? 这个完全串行化独占式操作数据库。性能嘛^-^.

隔离程度越高,数据库并发性越差;隔离程度越低,数据库并发性越好。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics