如果把事务设置成READ ON
只读事务对于运行那些涉及到一个或多个数据表的多查询来说,是很有用的;并且,在其他用户对表进行更新操作的时候,我们也可以对同样的表进行查询操作。
在只读事务中,所有的查询都会引用同一个提供多表,多查询,读一致视图的数据库快照。其他用户可以像平时一样继续查询或更新数据。在下面的例子中,作为一个商店经理,我们可以使用一个只读事务来收集过去一天、一周和一个月的销售量。在事务中,这些数字不会受到其他更新数据的用户的影响:
DECLARE
daily_sales REAL;
weekly_sales REAL;
monthly_sales REAL;
BEGIN
...
COMMIT; -- ends previous transaction
SET TRANSACTION READ ONLY NAME 'Calculate sales figures';
SELECT SUM (amt)
INTO daily_sales
FROM sales
WHERE dte = SYSDATE;
SELECT SUM (amt)
INTO weekly_sales
FROM sales
WHERE dte > SYSDATE - 7;
SELECT SUM (amt)
INTO monthly_sales
FROM sales
WHERE dte > SYSDATE - 30;
COMMIT; -- ends read-only transaction
...
END;
SET TRANSACTION语句必须是只读事务中的第一条SQL语句,且只能出现一次。如果把事务设置成READ ON
SET TRANSACTION的约束
只有SELECT INTO、OPEN、FETCH、CLOSE、LOCK TABLE、COMMIT和ROLLBACK语句才允许出现在只读事务中,并且查询过程不能使用FOR UPDATE。