我正在寻求澄清如何在plpgsql函数中确保原子事务,以及为数据库的这个特定更改设置隔离级别.
在下面显示的plpgsql函数中,我想确保删除和插入成功.当我尝试将它们包装在一个事务中时,我收到一个错误:
ERROR: cannot begin/end transactions in PL/pgSQL.
如果另一个用户在此功能删除了自定义行之后但在有机会插入自定义行之前添加了环境的默认行为('RAIN','NIGHT','45MPH'),则执行下面的函数时会发生什么?行?是否存在包含插入和删除的隐式事务,以便在另一个用户更改此函数引用的任一行时回滚它们?我可以为此功能设置隔离级别吗?
create function foo(v_weather varchar(10), v_timeofday varchar(10), v_speed varchar(10),
v_behavior varchar(10))
returns setof CUSTOMBEHAVIOR
as $body$
begin
-- run-time error if either of these lines is un-commented
-- start transaction ISOLATION LEVEL READ COMMITTED;
-- or, alternatively, set transaction ISOLATION LEVEL READ COMMITTED;
delete from CUSTOMBEHAVIOR
where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;
-- if there is no default behavior …Run Code Online (Sandbox Code Playgroud) transactions runtime-error plpgsql read-committed postgresql-9.2
我正在开发一个连接到oracle的网络应用程序.我们在oracle中有一个表"激活"列.任何时候只有一行可以将此列设置为1.为了强制执行此操作,我们一直在Java中使用SERIALIZED隔离级别,但是我们遇到了"无法序列化事务"错误,并且无法解决原因.
我们想知道READ COMMITTED的隔离级别是否可以完成这项工作.所以我的问题是:
如果我们有一个涉及以下SQL的事务:
SELECT *
FROM MODEL;
UPDATE MODEL
SET ACTIVATED = 0;
UPDATE MODEL
SET ACTIVATED = 1
WHERE RISK_MODEL_ID = ?;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
假设这些事务中有多个事务可能同时执行,那么多个MODEL行是否可以将激活标志设置为1?
任何帮助,将不胜感激.
在Mysql文档中:“ https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks-handling.html ”
它提到:“ 如果使用锁定读取(SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE),请尝试使用较低的隔离级别,例如READ COMMITTED。 ”
有人可以告诉我为什么我不能使用“重复阅读”吗?例子会很好。
干杯
我试图了解已提交读和未提交读隔离级别。我知道理论上读未提交允许脏读而提交读不允许,但我仍然无法真正理解。

考虑上图,如果没有任何事务被中止,那么对于已提交读和未提交读的最终结果是否相同?