第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

春季 JPA。更新數(shù)據(jù)庫值的正確方法

春季 JPA。更新數(shù)據(jù)庫值的正確方法

有只小跳蛙 2021-10-13 12:45:09
我正在學(xué)習(xí) Spring JPA 和 Hibernate。所以我遇到了一個問題。我有這個方法@Transactional(isolation = Isolation.REPEATABLE_READ)public void sendMoney(Long from, Long to, Double amount) {    WalletEntity fromWallet = walletServiceImpl.getWallet(from);    WalletEntity toWallet = walletServiceImpl.getWallet(to);    fromWallet.setAmount(fromWallet.getAmount() - amount);    toWallet.setAmount(toWallet.getAmount() + amount);    TransactionEntity transaction = new TransactionEntity();    transaction.setAmount(amount);    transaction.setToWallet(toWallet);    transaction.setFromWallet(fromWallet);    transactionRepository.saveAndFlush(transaction);}我想測試它并創(chuàng)建了這個:@GetMapping("/send")public void sendMoney() {    ExecutorService executorService = Executors.newFixedThreadPool(20);    for (int i = 0; i < 100; i++) {        executorService.execute(() -> {            accountServiceImpl.sendMoney(1L, 2L, 10D);        });    }}所以當我閱讀 wallet 時,我得到了舊的價值,但我做了Isolation.REPEATABLE_READ. 數(shù)據(jù)庫中的值當然是錯誤的。你能解釋一下有什么問題嗎?謝謝!
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

隔離級別 REPTEABLE_READ 按預(yù)期工作。


你可以在這里得到一個很好的解釋:


Spring @Transactional - 隔離、傳播


但為了澄清,這是發(fā)生的事情:


                      Tx1      Tx2

                       |        |

Tx1 Read Wallet 1     100       |

Tx2 Read Wallet 1      |       100

Tx1 Discounts 10     100-10     |

Tx2 Discounts 10       |      100-10

Tx1 Commits            |        |

Tx2 Commits            |        |

Tx1 Read Wallet 1      90       |

Tx2 Read Wallet 2      |        90

因此,為了控制這種行為,您有兩個選擇:


使用阻塞操作的可序列化事務(wù)級別以便一一處理(這有性能損失)

實現(xiàn)樂觀鎖(第二個事務(wù)如果同時嘗試修改同一個賬戶會拋出異常)

您可以從這里開始回顧樂觀鎖:JPA 中的樂觀鎖是如何工作的?


查看完整回答
反對 回復(fù) 2021-10-13
  • 1 回答
  • 0 關(guān)注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號