Oracle数据库事务隔离级别
1。幻想读:事务T1读取语句指定的地点条件并返回结果集。在这一点上,事务T2插入新的一行记录,这恰好满足T1,T1是查询条件。然后再以同样的条件和结果集可以看到T2插入记录,新的记录是幻想。
2,不要重复读取:事务t1读取一行记录。然后事务T2修改t1刚刚读取的记录。然后t1再次查询,发现它与第一读记录不同,称为不可重复读。
3、脏读:事务t1更新行记录,并且未提交修改。T2读取更新的数据,然后T1执行回滚操作,取消刚才的修改,所以T2读取的行是无效的,即脏数据。
首先,为了处理这些问题,SQL标准定义了以下事务隔离级别:
不允许读,用于幻想、不重复和脏读。会话可以读取未提交的其他事务的更新结果。如果事务以回滚结束,则读取结果可能不正确,因此大多数数据库不使用此隔离级别。
已提交读允许幻读,不反复阅读,并且不允许脏读。更新的结果,一个会话只能读取其他事务已提交或等待,但其他会话可以修改这个交易记录,而不必等待事务结束,显然,在这种隔离级别,两个相同的读操作的交易,结果可能是不同的。
可重复读让幻想来读,读不准,反复和肮脏。在交易中,如果没有记录添加操作两个读操作条件相同的情况下,没有其他更新操作之间,记录增加查询条件下的数量,所以两读的结果是一样的。换句话说,它是记录,是看在交易的第一时间确保不发生变化,这在transaction.sql服务器在整个事务读取记录锁实现这种隔离级别,因此,在交易结束前会议记录不能被其他事务修改,只能等待最后的成交,但SQL Server将不会阻止其他的研究记录添加到表中,也不妨碍其他修改其他会话记录。
序列化的幻想阅读,反复阅读和脏读是不允许的。在一个事务中,读操作的结果记录,其他交易的交易开始前提交。SQL Server通过加锁表的整个交易过程中实现隔离级别。该隔离级别下,餐桌上的所有DML操作是不允许的,那就是,等待交易完成。这保证了两个读操作的结果在一个事务中必须相同。默认的事务隔离级别由SQL标准定义的可串行化。
二、Oracle中的隔离级别和实现机制:
Oracle数据库支持读取和序列化的两种事务隔离级别。因此,Oracle不支持脏读,即Oracle不允许会话阅读其他事务未提交的数据修改的结果,从而防止不正确的阅读由于事务回滚。
在Oracle回滚段,当数据记录进行修改,在修改记录的结果存储在回滚段或撤销部分。Oracle的读操作不会阻碍更新操作,更新操作将不会阻碍读操作,所以在甲骨文不同的隔离级别下,读操作不会等待更新的交易结束,更新操作也不会因为另一个事务读取操作等优势,这是Oracle事务。
Oracle读取的默认隔离级别(又称此语句中的隔离级别),隔离级别,如果交易是在一个表执行DML操作,然后另一个会话表中的记录进行读操作,则Oracle将读取或更新存储之前回滚段回滚段记录,不SQL为结束交易服务器更新。
Oracle SERIALIZABLE隔离级别(也称为事务隔离等级),读操作在交易只能读交易前开始提交数据结果。如果在阅读,其他事务对记录的修改,原来的未修改的甲骨文将记录在回滚段或撤销段中找到对应的(但之前的交易开始读取操作的记录存储在回滚或撤销),然后读操作不会因为相应的记录在等待更新。
使用SETTRANSACTIONISOLATIONLEVEL {未提交读|读取|可重复读|序列化设置隔离级别}
以下是Oracle设置SERIALIZABLE隔离级别的实例。
左侧和右侧交易T1,T2是交易,因为T2水平是可序列化的,所以即使事务T1提交的数据,事务T2依然看不到T1提交的数据,幻想和不可重复读是不允许的。
那么我们怎样才能看到T1的新记录呢t1和T2是并行执行。当T1执行插入,事务T2已经开始,因为T2水平是可序列化的,所以数据查询是数据库中的数据通过T2 T2交易开始前,即在插入和更新操作的事务T1 T2开始交易后的影响不会影响事务T2。现在重启交易T3,你可以看到新的T1记录。
当下列事件发生时,业务开始:
1,连接数据库,并执行第一个DML语句
2。以前的交易后,进入了另一个DML语句。