Java Spring数据JPA和事务管理
在我的spring服务中,我调用了两个spring数据存储库方法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
@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方法是事务性的。来源: