1.读未提交(Read Uncommitted):在这个级别下,一个事务可以读取另一个尚未提交的事务的修改。这意味着,如果一个事务正在修改数据,而另一个事务尝试读取这些数据,那么第二个事务可能会看到第一个事务的未提交修改。这种级别可能会导致“脏读”问题,即读取到其他事务尚未提交的数据。
2.读已提交(Read Committed):这是大多数数据库系统的默认隔离级别。在这个级别下,一个事务只能读取已经提交的事务的修改。这可以防止“脏读”问题,因为未提交的事务的修改对其他事务是不可见的。但是,它仍然可能导致“不可重复读”和“幻读”问题。
3.可重复读(Repeatable Read):在这个级别下,一个事务在整个过程中可以多次读取同一数据,并确保每次读取的结果都是相同的。这可以防止“不可重复读”问题,因为一个事务在读取数据时,其他事务不能对其进行修改。但是,它仍然可能导致“幻读”问题。
4.可串行化(SERIALIZABLE):这是最高的隔离级别。在这个级别下,事务被完全串行化执行,即一次只能执行一个事务。这可以防止所有并发控制问题,包括“脏读”、“不可重复读”和“幻读”。但是,这也可能降低数据库的并发性能。
常见问题
Q1:如何查看当前事务隔离级别
SELECT s.sid, s.serial#, BITAND(t.property, 67108864)/67108864 AS isolation_level FROM v$transaction t, v$session s WHERE t.addr = s.taddr;
Q2:与MySQL隔离级别的差异?
MySQL默认REPEATABLE READ,通过Next-Key Lock解决幻读
Oracle默认READ COMMITTED,通过MVCC实现高并发