说数据读取操作不需要在事务内部运行是否正确?

时间:2012-06-25 09:33:06

标签: database transactions acid

假设某个方法只从数据库中读取数据而不写入数据。总是这种方法不需要在事务中运行吗?

3 个答案:

答案 0 :(得分:2)

在许多数据库中,从数据库读取的请求(不在显式事务中)隐式创建了一个事务来运行请求。

在SQL数据库中,如果您运行多个SELECT语句,并且不希望其他事务的更改显示在一个SELECT中,而不是更早的更改,则可能需要使用事务。在SERIALIZABLE事务隔离级别运行的事务将在多个语句中呈现一致的数据视图。

答案 1 :(得分:1)

没有。如果您没有在特定的隔离级别读取,则可能无法获得足够的保证。例如,行可能会消失,或者可能会出现新行。

即使是单一陈述也是如此:

select * from Tab
except select * from Tab

此查询实际上可以在并发修改的情况下返回行,因为它会扫描表两次。

SQL Server:有一种简单的方法可以获得快速,无阻塞,非锁定,一致的读取:启用快照隔离并读取快照事务。 AFAIK Oracle也具有此功能。 Postgres也是。

答案 2 :(得分:0)

事务的目的是回滚或提交对数据库执行的操作,如果您只是选择值并且不对数据进行任何更改则不需要事务。