我不经常使用存储过程,我想知道将选择查询 Package 在事务中是否有意义。我的过程有三个简单的选择查询,其中两个使用第一个的返回值。
wrrgggsh1#
在一个高度并发的应用程序中,(理论上)可能会发生在第一个选择中读取的数据在其他选择执行之前被修改的情况。如果在你的应用程序中可能会出现这种情况,你应该使用一个事务来 Package 你的选择,但是要确保你选择了正确的isolation level,不是所有的事务类型都能保证一致的读取。
uelo1irk2#
事务通常在您有CREATE、UPDATE或DELETE语句,并且希望具有原子行为(即,* 提交所有内容或不提交任何内容 *)时使用。
CREATE
UPDATE
DELETE
但是,您可以使用READ select语句的事务来执行以下操作:
READ
确保在执行选择查询串时,没有其他人可以更新感兴趣的表。
看看这个msdn post。
46scxncf3#
大多数数据库运行事务中的每一个查询,即使没有指定它也是隐式 Package 的。这包括select语句。PostgreSQL实际上将每个SQL语句都视为在事务中执行。如果您不发出开始命令,则每个单独的语句都有一个隐式的BEGIN和(如果成功)COMMIT环绕。由BEGIN和COMMIT环绕的一组语句有时被称为事务块。https://www.postgresql.org/docs/current/tutorial-transactions.html
3条答案
按热度按时间wrrgggsh1#
在一个高度并发的应用程序中,(理论上)可能会发生在第一个选择中读取的数据在其他选择执行之前被修改的情况。
如果在你的应用程序中可能会出现这种情况,你应该使用一个事务来 Package 你的选择,但是要确保你选择了正确的isolation level,不是所有的事务类型都能保证一致的读取。
uelo1irk2#
事务通常在您有
CREATE
、UPDATE
或DELETE
语句,并且希望具有原子行为(即,* 提交所有内容或不提交任何内容 *)时使用。但是,您可以使用
READ
select语句的事务来执行以下操作:确保在执行选择查询串时,没有其他人可以更新感兴趣的表。
看看这个msdn post。
46scxncf3#
大多数数据库运行事务中的每一个查询,即使没有指定它也是隐式 Package 的。这包括select语句。
PostgreSQL实际上将每个SQL语句都视为在事务中执行。如果您不发出开始命令,则每个单独的语句都有一个隐式的BEGIN和(如果成功)COMMIT环绕。由BEGIN和COMMIT环绕的一组语句有时被称为事务块。
https://www.postgresql.org/docs/current/tutorial-transactions.html