事务的隔离级别,事务隔离级别
数据库系统有四个隔离级别,分别为未提交读、已提交读、可重复读、串行化
大多数数据库的默认级别就是Read
committed,比如Sql Server , Oracle。Mysql的默认隔离级别就是Repeatable read。
READ
UNCOMMITTED(未提交读)
事务A执行的操作未提交,但是事务B还是能看到修改,这时会产生脏读的情况。
READ
COMMITTED(提交读)
事务A先是读取了数据,这时事务B更改了同一数据,并已提交,这时事务A再次读取这个数据时就会发现两次数据不一致,这就产生不可重复读的现象。
REPEATABLE
READ(可重复读)
当事务A读取记录时,会对此记录添加一个共享锁,即事务B不能在事务A结束前对记录进行修改。
可能产生的问题:当执行范围查询时,可能会产生幻读。如事务A先查询一个消费总量,接着事务B增加一条消费记录,这时事务A再次查询消费总量时,就会发现两次查询不一致
SERIALIZABLE(序列化)
添加范围锁(比如表锁,页锁等、),直到transaction A结束。以此阻止其它transaction B对此范围内的insert,update等操作。幻读,脏读,不可重复读等问题都不会发生。
|
|
脏读 |
不可重复读 |
幻读 |
|
Read uncommitted |
√ |
√ |
√ |
|
Read committed |
× |
√ |
√ |
|
Repeatable read |
× |
× |
√ |
|
Serializable |
× |
× |
× |
oracle事务隔离级别:
读取未提交:TRANSACTION_READ_UNCOMMITTED(最低)
读取提交:TRANSACTION_READ_COMMITTED(默认)
可重读:TRANSACTION_REPEATABLE_READ
可串化:TRANSACTION_SERIALIZABLE(最高)
1. RR隔离级别: 在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁; 如果是更新, 则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫描的纪录数量。
2. RS隔离级别: 此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。 不论是读取, 还是更新, 如果SQL语句中包含查询条件, 则会对所有符合条件的纪录加相应的锁。 如果没有条件语句, 也就是对表中的所有记录进行处理,则会对所有的纪录加锁。
3. CS隔离级别: 此隔离级别仅锁住当前处理的纪录。
4. UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。对于非只读的操作,它的锁处理和CS相同