Mar*_*ri9 0 sql database postgresql spring
我正在使用Spring和PostgreSQL,我尝试使用如下代码进行一种UPSERT:
jt.update("delete from A where id = 1")
jt.update("insert into A (id, value) values (1, 100)")
Run Code Online (Sandbox Code Playgroud)
包含在事务中(使用@Transactional
).
问题是,当有很多并发请求时,此代码会因"重复键"错误而失败,这意味着事务不是孤立的,或者......
我错过了有关交易如何运作的信息吗?我应该在这里使用不同的机制(例如线程同步)吗?
假设这个简单的表:
CREATE TABLE tbl(id int primary key, value int);
Run Code Online (Sandbox Code Playgroud)
对于并发事务,此功能几乎100% 安全(见评论)。:
CREATE OR REPLACE FUNCTION f_upsert(_id int, _value int)
RETURNS void AS
$func$
BEGIN
LOOP
UPDATE tbl SET value = _value WHERE id = _id;
EXIT WHEN FOUND;
BEGIN
INSERT INTO tbl (id, value)
VALUES (_id, _value);
RETURN;
EXCEPTION WHEN UNIQUE_VIOLATION THEN -- tbl.id has UNIQUE constraint.
RAISE NOTICE 'It actually happened!'; -- hardly ever happens
END;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
称呼:
SELECT f_upsert(2, 2);
Run Code Online (Sandbox Code Playgroud)
它与这个INSERT / SELECT
案例非常相似,有更多的解释和链接:
归档时间: |
|
查看次数: |
2763 次 |
最近记录: |