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

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

spring jpa crud 存儲庫在多線程環(huán)境中從數據庫中獲取舊數據

spring jpa crud 存儲庫在多線程環(huán)境中從數據庫中獲取舊數據

慕的地8271018 2023-03-17 14:07:01
我正在使用 mysql 數據庫和 kafka 作為消息服務運行 spring boot 應用程序(使用 chainedKafkaTransactionManager 為 kafka 和 mysql 進行事務同步)以進行一些異步操作。當多條消息到達 kafka 監(jiān)聽器時,舊數據來自數據庫而不是以前提交的數據。我正在使用 crud 存儲庫,而且這種情況只會同時發(fā)生在多條消息上示例:更新一個具有名稱和 ID 的對象 PERSON;第一條消息將通過 id 獲取對象并將名稱更新為 SAM。第二條消息將獲取對象并將名稱更新為 REGO第三條消息將獲取對象,然后如果我檢查它包含 SAM 作為名稱的數據,但在數據庫中它有 REGO。我嘗試添加隔離屬性作為事務中提交的讀取但沒有運氣// listeners  @Autowiredprivate PersonRepository personRepository;@Autowiredprivate AddressRepository addressRepository;     @KafkaListener(id = "update_name", topics = "update_name")@Transactional(readOnly = false)public void updateName(PersonModel personModel) {    Person person = personRepository.findById(personModel.getId());       log.info("before -> name which is in database : " + person.getName());    person.setName(personModel.getName());    person = personRepository.save(person);    log.info("after-> name which is in database : " + person.getName());}@KafkaListener(id = "update_name_and_address", topics = "update_name_and_address")@Transactional(readOnly = false)public void updateNameAndAddress(PersonModel personModel) {    Address addr= addressRepository.findById(personModel.getAddresId);        addr.setPlace(personModel.getPlace());    addressRepository.save(addr);    updateName(personModel);}// repositorypublic interface PersonRepository extends CrudRepository<Person , Integer> {}我需要數據庫中的最新數據
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

當第三個事務在第二個事務提交之前開始時,就會發(fā)生這種情況。效果變得更加明顯,因為一旦在會話中加載實體,JPA 就不會重新加載它。

為了盡量減少這個問題,請盡可能縮短您的交易時間。還要確保您可能通過在新事務中重試來處理樂觀鎖定異常。


查看完整回答
反對 回復 2023-03-17
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號