在Oracle中,可以执行顺序事务来使得用户能够取得特定时间点的数据。
当然,用只读事务(SET TRANSACTION READ ONLY;)也可以达到同样的目的,但是使用只读事务后,当前会话将不能执行INSERT/UDDATE/DELETE语句。为了能够取得特定时间点的数据并且要求同样能够使用DML语句,就可以使用顺序事务。
示例如下:
当前存在两个回话:会话A和会话B。执行顺序如下所示。
会话A:
①SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
②select losal from salgrade where grade = '1';(结果:1100)
回话B:
①update salgrade set losal = '1200' where grade = '1';
②commit;
会话A:
③select losal from salgrade where grade = '1';(结果:1100)
④update salgrade set losal = '1200' where grade = '2';(结果:执行成功)
⑤update salgrade set losal = '1300' where grade = '1';(结果:执行失败)
★当设置事务顺序时,该语句必须是事务开始的第一条语句。