您的位置:首页 > 数据库

数据库赃读、不可重复读、幻读

2017-09-13 18:00 232 查看

这些是事务并发产生的问题。

事务隔离五种级别:
        TRANSACTION_NONE  不使用事务。
        TRANSACTION_READ_UNCOMMITTED  允许脏读。
        TRANSACTION_READ_COMMITTED  防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别
        TRANSACTION_REPEATABLE_READ  可以防止脏读和不可重复读,
        TRANSACTION_SERIALIZABLE  可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率

基本概念

赃读:

  一个事务读取到了另外一个事务没有提交的数据

       可以避免的方案:Read committed 读提交 ,一个事务提交后再读。

       大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。

不可重复读:

  在同一事务中,两次读取同一数据,得到内容不同

  可以避免的方案:(即实现可以重复读),数据库事务隔离级别Repeatable read。一个事务A进行中,不允许另一个事务B 操作这个事务A 涉及到的数据。

  Mysql的默认隔离级别就是Repeatable read。

幻读:

  同一事务中,用同样的操作读取两次,得到的记录数不相同 

  幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改, 这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表

中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

       可以避免的方案:

       Serializable :是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

 

【参考链接

http://blog.csdn.net/jiesa/article/details/51317164

http://blog.csdn.net/gaoshan_820822/article/details/4582561
    

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐