Что означает «Распространение. НИКОГДА не выполняется транзакционно» в Spring? - PullRequest
0 голосов
/ 10 марта 2020

В приведенном ниже коде операция сохранения в методе createDevice внутри класса DeviceService не будет выполняться внутри транзакции, что означает, что эта операция не выполняется внутри транзакции? Можно ли выполнить операцию над базой данных без транзакции?

package controller;

import model.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import service.DeviceService;

@RestController
public class DeviceController {

    @Autowired
    private DeviceService deviceService;

    @PostMapping("/devices")
    @ResponseStatus(HttpStatus.CREATED)
    public void createDevice(@RequestBody Device device) {
        deviceService.createDevice(device);
    }
}

-

package service;

import model.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import repository.DeviceRepository;

@Service
public class DeviceService {
    @Autowired
    private DeviceRepository deviceRepository;
    @Transactional(propagation = Propagation.NEVER)
    public void createDevice(Device device) {
        deviceRepository.save(device);
    }
}

-

package repository;

import model.Device;
import org.springframework.data.jpa.repository.JpaRepository;
public interface DeviceRepository extends JpaRepository<Device, Integer> {
}

-

package model;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Device {
    @Id
    private Integer id;
    private String name;
}

Редактировать I использую MySQL базу данных. Операция выполнена успешно. Любые детали о том, как это выполняется без транзакции? Что делается в сцене?
В чем разница между выполнением операции внутри транзакции и без транзакции?

1 Ответ

0 голосов
/ 10 марта 2020

Для логи транзакций c с распространением NEVER Spring создает исключение, если есть активная транзакция.

Источник 1

Мы должны избегать сохранения извне граница транзакции, иначе сопоставленные объекты не будут сохранены, что приведет к несогласованности данных. Сбрасывать сессию очень нормально, потому что она не выдает никаких исключений или предупреждений.

Источник 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...