首页 > 解决方案 > Spring中的“Propagation.NEVER Executes non-transactionally”是什么意思?

问题描述

在下面的代码中,DeviceService类内部createDevice方法中的save操作不会在事务内部执行,请问这个操作不在事务内部执行是什么意思呢?是否可以在没有事务的情况下对数据库执行操作?

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;
}

编辑 我正在使用 MySQL 数据库。操作成功执行。关于如何在没有交易的情况下执行的任何细节?幕后在做什么?
在事务内部执行操作和不执行事务有什么区别?

标签: springhibernatespring-bootspring-data-jpaspring-transactions

解决方案


推荐阅读