时间:2021-05-20
今天我们介绍的是jpa删除和事务的一些坑,接下来看看具体内容。
业务场景(这是一个在线考试系统)和代码:根据问题的id删除答案
repository层:
int deleteByQuestionId(Integer questionId);service 层:
测试层:
@Testpublic void testDeleteByQuestionId() { choiceAnswerService.deleteChoiceAnswerByQuestionId(5); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe");}问题1:如果各层都不加事务管理的话
@Transactional
会报这个错误
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process ‘remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process ‘remove' call
当我们除了query外的modiy和delete外如果没有各层的方法中进行事务管理的话也就是没加@Transactional话会报错
问题2:只在test层加@Transactional
没有错误但是数据并没有被删除,在用IDEA的调试是,在执行这个测试方法的过程时还可以在choiceanswer表中进行操作并没有加锁事务并没有起作用
问题3:只在 Repository层加@Transactional
public void deleteChoiceAnswerByQuestionId(Integer questionId) {choiceAnswerRepository.deleteByQuestionId(questionId);System.out.println(“hehehhe”);System.out.println("hehehhe");// questionRepository.delete(5);System.out.println(“hehehhe”); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe"); System.out.println("hehehhe");}这时当执行完
数据里面被修改
问题4:只在 service层加@Transactional
当只有执行完service内的对应方法时数据才会被删除
问题5:在service 层和Repository都加上@transactional
当只有执行完service内的对应方法时数据才会被删除
问题6:只要在test(或者是除了service层和Repository层)加上@Transactional,不管service层和Repository层加不加@Transactional数据都不会被删除
问题7:
@Modifying@Query(“delete from ChoiceAnswer c where c.question.id=?1 “)@Transactionalint deleteByQuestionId(Integer questionId);与
有什么区别,上面的会直接执行delete语句
下面的会先执行select 再执行delete
总结:
事务管理只有在service加上事务管理才起作用,query不需要事务管理但是delete update但需要事务管理为了不在Service层不加事务管理可以再Repository层的delete uodate加上@transactional 但这样不能真正保持事务的完整性.
本文关于Spring boot jpa 删除数据和事务管理的问题实例详解的介绍就到这里,希望对大家有所帮助,欢迎大家参阅本站其他专题。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。比如当使用jpa的时候,也就是pom中加入了spring-boot-sta
Spring事务管理Spring支持两种方式的事务管理:编程式事务管理:通过TransactionTemplate手动管理事务,实际应用中很少使用,使用XML配
Spring事务隔离与事务传播的详解与对比Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spri
前言在前面的小节中,我们学习了关于事务的概念以及事务管理的重要性,并且通过编程使用Spring的编程式事务管理进行操作,加深对事务管理的重要性的学习,不过,由于
配置事务:使用的tx前缀的标签,导入tx的命名空间配置事务管理器,把事务管理器交给Spring管理:事务的策略transaction-manager:事务增强基