假设我有一个像下面的一些PostgreSQL的功能:如何使PostgreSQL函数成为原子?
CREATE FUNCTION insertSth() RETURNS void AS $$
BEGIN
INSERT INTO ...;
END;
CREATE FUNCTION removeSthAfterSelect() RETURNS TABLE(...) AS $$
BEGIN
SELECT id INTO some_id ...;
RETURN QUERY SELECT * FROM ...;
DELETE FROM ... WHERE id = some_id;
END;
CREATE FUNCTION justDeleteSth() RETURNS void AS $$
BEGIN
DELETE FROM ...;
END;
CREATE FUNCTION justSelectSth() RETURNS TABLE(...) AS $$
BEGIN
RETURN SELECT * FROM ...;
END;
从我的理解PostgreSQL的功能insertSth
,justDeleteSth
和justSelectSth
将要自动执行(?)。所以平行执行它们不会搞砸任何东西。
但removeSthAfterSelect
如果有一个并行执行它可能是SELECT id INTO some_id ..
发现的东西,然后同时另一个事务调用justDeleteSth
与id = someId
删除了该行,所以当交易继续这里就不再删除任何东西:DELETE FROM ... WHERE id = some_id;
这意味着它混乱了事情。
这是这种情况? 有没有办法避免这个问题?例如。通过说removeSthAfterSelect
应该原子执行?
感谢您的回答。在阅读了关于事务隔离之后,我想出了另一个可以在这里找到的问题:http://stackoverflow.com/questions/26195339/select-into-with-select-for-update-in-postgresql。我会很高兴,如果你可以看看:) – insumity 2014-10-04 17:34:01