我正在使用Isolation.REPEATABLE_READ在 Spring Boot 應用程式中復制大型物體圖。它基本上執行 SELECT 和 INSERT。我還在@Version所有子物體上使用注釋使用樂觀鎖定。我看到,即使我在復制執行期間嘗試更改物體圖中的某些內容,后者也會繼續,就好像什么也沒發生一樣。讓我們假設從商業角度來看,這是可以接受的。根據 SQL-92 標準,可能發生的現象有:
- 臟讀
- 不可重復讀
- 幻讀
另外四個(ANSI SQL 隔離級別批判:https : //www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf):
- 臟寫
- 讀取偏斜
- 寫偏斜
- 丟失更新
據我所知,在 PostgreSQL 上使用可重復讀,只能寫偏斜。但是使用樂觀鎖定,不會發生不一致。這個想法正確嗎?
uj5u.com熱心網友回復:
在 PostgreSQL 上使用可重復讀,只能寫偏斜
正確的。
但是使用樂觀鎖定,不會發生不一致。
不,那是不正確的。您可以通過樂觀鎖定獲得“寫偏斜”:
CREATE TABLE worker (
name text,
on_duty boolean,
version bigint DEFAULT 0
);
INSERT INTO worker (name, on_duty) VALUES
('alice', TRUE),
('bob', TRUE);
現在有兩個事務在桌子上作業:
Transaction 1 Transaction 2
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT name, version FROM worker WHERE on_duty;
name │ version
═══════╪═════════
alice │ 0
bob │ 0
(2 rows)
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT name, version FROM worker WHERE on_duty;
name │ version
═══════╪═════════
alice │ 0
bob │ 0
(2 rows)
UPDATE worker
SET on_duty = FALSE, version = version 1
WHERE name = 'bob' AND version = 0;
COMMIT;
UPDATE worker
SET on_duty = FALSE, version = version 1
WHERE name = 'alice' AND version = 0;
COMMIT;
兩個事務都成功了,但你有寫偏斜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355888.html
標籤:PostgreSQL 休眠 jpa 春季交易 隔离级别
