Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA和事务管理_Java_Spring_Transactions_Spring Data Jpa_Spring Transactions - Fatal编程技术网

Java Spring数据JPA和事务管理

Java Spring数据JPA和事务管理,java,spring,transactions,spring-data-jpa,spring-transactions,Java,Spring,Transactions,Spring Data Jpa,Spring Transactions,在我的spring服务中,我调用了两个spring数据存储库方法 @Service public class ClientService { public void updateClientByIdAndKey(final Integer id, final String key) { final Client client = clientRepository.findByIdAndKey(id, key); // .. Update client de

在我的spring服务中,我调用了两个spring数据存储库方法

@Service
public class ClientService {
    public void updateClientByIdAndKey(final Integer id, final String key) {
        final Client client = clientRepository.findByIdAndKey(id, key);
        // .. Update client details
        client.save(client);
   }
}
现在我的查询与事务管理相关。就我所了解和看到的代码而言,spring存储库使用@Transactional为其方法启用了事务。对于select操作,它具有readonly=true

我对事务的理解是,当执行select操作时,将创建一个事务,然后为保存操作创建另一个事务,因为select操作的事务为readOnly=true

我希望在一个事务中执行读写操作。如果我以上的理解是正确的,那么在服务方法上使用@TransactionalupdateClientByIdAndKey将在一个事务中同时运行这两个操作,这是我的意图,还是spring将在一个事务中同时执行这两个操作


如果此处缺少任何内容,请告诉我。

@Transactional的只读属性默认为false。通过简单地使用事务性注释方法,读取/选择操作和更新操作将在单个事务中发生。如果您将属性更改为true,我猜您不会有两个事务发生,而是在尝试更新时会引发异常

编辑:
如果该方法未使用事务性注释,则两个操作将不会在单个事务中执行。事实上,根据您如何配置ORM,执行更新时可能会引发异常,因为连接将在选择后关闭。

当您将
@Transactional
注释添加到
updateClientByIdAndKey
方法时,spring将只创建一个读写事务(除非使用
传播在
findbyiandkey/save
方法上添加了额外的
@Transactional
注释,否则需要新的
或其他类型的。当您将
readOnly=true
添加到
@Transactional
时,spring将在Hibernate会话上设置
flushMode
,将设置为
从不
。)这意味着您不能执行任何创建、更新和删除操作。

方法findByIdAndKey不需要执行提交(将更改存储到数据库)操作,并应注释为

@Transactional(readOnly = true)
方法updateClientByIdAndKey应使用

@Transactional
updateClientByIdAndKey中,仅使用一个读写事务,除非嵌套方法findByIdAndKey定义了

@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)

在这种情况下,您将显式创建一个新的(只读)没有意义的事务。

谢谢@Dean的输入。但问题是,如果我不使用@Transactional注释服务方法,spring数据会在一个事务中内部执行select和update操作吗?您使用的是Hibernate吗?如果您不使用
@Transactional
注释服务方法,spring会吗在没有任何事务的情况下执行这两个查询。因此数据将在
save
方法调用中持久化。如文档中所述:默认情况下,存储库实例上的CRUD方法是事务性的。来源: