事务隔离级别

来源:互联网 发布:json 特殊字符 编辑:程序博客网 时间:2024/06/05 14:42

  对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
      1).脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的。也就是读取了其他事务还没有提交的数据
      2).不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了。当前事务已经读取的数据记录,被其他事务修改或删除。
      3).幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行。其他事务插入了新的数据,当前事务以相同的查询条件,在那个事务插入数据之前和之后查询数据,得到的数据记录的条数不一样
    数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题. 
    一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

隔离级别(isolation level),是指事务与事务之间的隔离程度。
  显然,事务隔离程度越高,并发性越差、性能越低;事务隔离程度越低,并发性越强、性能越高

    Oracle明确支持ANSI/ISO SQL92中定义的serializable和read committed两种事务隔离级别。同时,Oracle还提供了自己独有的事务隔离级别:read only。
 所以,可以说Oracle共支持3种事务隔离级别
1.serializable
2.read committed
3.read only
Oracle默认的隔离级别是read committed。

查看数据库隔离级别的方法:
    1.SELECT * FROM dual FOR UPDATE;
    2.SELECT s.sid, s.serial#,
      CASE BITAND(t.flag, POWER(2, 28))
           WHEN 0 THEN 'READ COMMITTED'
           ELSE 'SERIALIZABLE'
        END AS isolation_level
      FROM v$transaction t
     JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

修改数据库隔离级别的方法:
    设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

    Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
设置隔离级别
1).在 MySql 中设置隔离级别

    每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别. MySQL 默认的隔离级别为 Repeatable Read
  查看当前的隔离级别: SELECT @@tx_isolation;
  设置当前 mySQL 连接的隔离级别:  
    set transaction isolation level read committed;
  设置数据库系统的全局的隔离级别:
     set global transaction isolation level read committed;



0 0
原创粉丝点击