zoukankan      html  css  js  c++  java
  • TransactionScope IsolationLevel 事务隔离级别

    事务有四个特性

    第一原子性,事务具有独立的不能被拆分的,不能只做部分,事务的性质是要么全做,要么都不做。

    第二统一性,在事务执行之前和事务执行之后的数据是一致。

    第三隔离性,事务是独立的,开发者不能查看中间状态。对同一张表同一时间最多只能有一个事务处理。

    第四永久性,事务的发生对数据库的影响是永久的。


    事务管理系统引入了锁的机制,正是因为锁的这种机制,一个事务才能与其他的事务隔离,根据你给每个事务设置的Isolation level不同,锁的行为也不相同。在.NET transaction scope中,有四个非常重要的隔离级别。

    1. Serializable
    2. Repeatable Read
    3. Read Committed
    4. Read UnComitted

    Read Uncommitted: 允许读取脏数据,一个事务能看到另一个事务还没有提交的数据。

    Read Committed: 确保事务读取的数据都必须是已经提交的数据。它限制了读取中间的,没有提交的,脏的数据。但是它不能确保当事务重新去读取的时候,读的数据跟上次读的数据是一样的,也就是说当事务第一次读取完数据后,该数据是可能被其他事务修改的,当它再去读取的时候,数据可能是不一样的。

    Repeatable Read: 是一个更高级别的隔离级别,如果事务再去读取同样的数据,先前的数据是没有被修改过的。

    Serializable: 它做出了最有力的保证,除了每次读取的数据是一样的,它还确保每次读取没有新的数据。


    举例说明, 你现在有个表T,列名C,并且包含一条数据在里面,我们假设是‘1’, 现在你有个简单的执行任务:

    BEGINTRANSACTION;
    SELECT *FROMT;
    WAITFOR DELAY'00:01:00'
    SELECT *FROMT;
    COMMIT;


    这是一个简单的,执行了两次读操作的任务,在两次读取中间我们延迟一分钟。

    如果是Read Commited, 那第二次读取可能返回任意值,因为另外一个同时进行的事务可能更新,删除,插入新的数据。第二个查询总是看到最新的数据。

    如果是Repeatable Read, 那第二次读取就能确保跟第一个已经读取的行的数据是一样的。但是另外一个同时进行的事务可能会新增加行,但是第一次读取的行是不能删除和修改的。

    如果是Serializable, 那就能确保两次读取看到的数据和行数是一样的。没有数据修改,删除,也没有新行添加进来。


  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/peteryan/p/3791808.html
Copyright © 2011-2022 走看看