Уровень изоляции Spring Data JPA не влияет на запросы SQLServer

#sql-server #spring-data-jpa #isolation-level #read-uncommitted

Вопрос:

У меня есть класс @Service layer с несколькими методами, которые имеют @Транзакционный(изоляция = Изоляция.READ_UNCOMMITTED) аннотированные запросы и @Транзакционные аннотированные транзакции записи. Иногда в транзакциях появляется взаимоблокировка, и я вижу в XML-анализе взаимоблокировки профилировщика SQLServer, что запросы имеют уровень изоляции READ_COMMITED. Как можно изменить настройки уровня изоляции для транзакций? Любая помощь приветствуется.

Существуют такие хранилища, как это:

 @Repository
public interface mStorageRepository extends AdBaseClientOrgRepository<mStorage, Long>  {
    @Modifying
    @Query("UPDATE mStorage s SET s.qtyonhand = s.qtyonhand   ?2, s.updated = current_timestamp WHERE s.id = ?1")
    void updateqtyBymStorageid(long id, BigDecimal movementqty);

    @Query("SELECT s FROM mStorage s WHERE s.locator.id = ?1 AND s.stockAlert = ?2 order by s.datelastinventory")
    Iterable<mStorage> getByLocatorAndStockAlert(long mLocatorId, String stockAlert);
.
.
.
}
 

Существуют такие уровни обслуживания дат, как этот:

     @Service
    public class mStorageService extends AdBaseClientOrgService<mStorage, mStorageRepository> {
    
        @Autowired
        public mStorageService(Logger logger, TimeService timeService, MessageService messageService) {
            super(logger, timeService, messageService);
        }
    
        @Override
        @Autowired
        public void setRepo(mStorageRepository repo) {
            this.repo = repo;
        }
    
    
        @Transactional
        public void updateqtyBymStorageid(long id, BigDecimal movementqty) {
            logger.debug("start updateqtyBymStorageid : {} , {}",id,movementqty);
            repo.updateqtyBymStorageid(id, movementqty);
            logger.debug("end updateqtyBymStorageid : {} , {}",id,movementqty);
        }
    
    
        @Transactional(isolation = Isolation.READ_UNCOMMITTED)
        public Iterable<mStorage> getByLocatorAndStockAlert(long locatorId, StockAlert stockAlert) {
            Iterable<mStorage> ret = this.repo.getByLocatorAndStockAlert(locatorId, stockAlert.toString());
            getLazyProperties(ret);
            return ret;
        }
.
.
.
 

}

Существует также несколько реализаций уровня обслуживания бизнес-логики:

 @Service
public class BaseProductionPartsUsageService {

    @Autowired
    public BaseProductionPartsUsageService(final Logger logger) {
        this.logger = logger;
        logger.info("BaseProductionPartsUsageService initialized");
    }

    protected Logger logger;


    @Autowired
    public void setStorageService(mStorageService storageService) {
        this.storageService = storageService;
    }

    protected mStorageService storageService;

// calls several data service methods in method annotated with @Transactional
.
.
.
 }
 

Иногда у нас возникает взаимоблокировка, и когда мы проверяем детали в профилировщике SQLServer, мы видим, что метод запроса, который был аннотирован READ_UNCOMMITED, является READ_COMMITED в xml-файле профилировщика.

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

2. Я попытался сообщить больше подробностей. Я надеюсь, что это объясняет ситуацию.

3. В любом случае, кто-нибудь знает, каковы правила смешивания различных уровней изоляции (read_commited, read_uncommited) в одном и том же @Транзакционном?