首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Transactional只读

Spring @Transactional只读
EN

Stack Overflow用户
提问于 2017-06-12 09:46:51
回答 1查看 5.2K关注 0票数 3

我有一个基本的SpringBoot应用程序。使用Spring初始化器、嵌入式Tomcat、Thymeleaf模板引擎和包作为可执行的JAR文件

带着这种依赖

代码语言:javascript
复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

我已经创建了这个声明为readOnly的服务:

代码语言:javascript
复制
@Service
@Transactional(readOnly = true)
public class TimeLapseService {

    @Autowired
    TimeLapseRepository timeLapseRepository;

    public Set<TimeLapse> findAllByCompanyId(long companyId) {
        return timeLapseRepository.findAllByCompanyId(companyId);
    }

    public Iterable<TimeLapse> findAll (User user) {

        if (user.isAdmin()) {
            return timeLapseRepository.findAll();
        } else {
            return timeLapseRepository.findAllByCompanyId(user.getCompany().getId());
        }   

    }

    public void createTimeLapse (TimeLapse timeLapse) {
        timeLapseRepository.save (timeLapse);
    }

}

代码语言:javascript
复制
public interface TimeLapseRepository extends CrudRepository<TimeLapse, Long> {
....
}

据我所知,由于服务声明为readonly,创建新服务不应将任何内容持久化到DB,而是在表中创建行。

代码语言:javascript
复制
timeLapseService.createTimeLapse(timeLapse24h);

JPA属性:

代码语言:javascript
复制
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
hibernate.dialect=org.hibernate.dialect.H2Dialect
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-12 10:44:09

BeanS调用事务性=只读Bean1,它执行查找,并调用事务性=读写Bean2来保存新对象。

代码语言:javascript
复制
> Bean1 starts a read-only tx. 31 09:39:44.199 [pool-1-thread-1] DEBUG
> o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name
> [nz.co.vodafone.wcim.business.Bean1.startSomething]:
> PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''

> 
> Bean 2 pariticipates in it. 31 09:39:44.230 [pool-1-thread-1] DEBUG
> o.s.orm.jpa.JpaTransactionManager - Participating in existing
> transaction
> 

没有任何东西被提交到数据库。 现在更改Bean2 @Transactional注释以添加propagation=Propagation.REQUIRES_NEW

代码语言:javascript
复制
> Bean1 starts a read-only tx. 31 09:31:36.418 [pool-1-thread-1] DEBUG
> o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name
> [nz.co.vodafone.wcim.business.Bean1.startSomething]:
> PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
> 
> Bean2 starts a new read-write tx 31 09:31:36.449 [pool-1-thread-1]
> DEBUG o.s.orm.jpa.JpaTransactionManager - Suspending current
> transaction, creating new transaction with name

除非你按下面的方式做,否则它将被持久化。

代码语言:javascript
复制
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void createTimeLapse (TimeLapse timeLapse)
   { 
    timeLapseRepository.save (timeLapse); 
   } 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44496333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档