异常:
Caused by: com.server.exception.BusinessException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at com.swms.server.service.shipping.pojo.DefaultSupplyDocManager.importSupplyDoc(DefaultSupplyDocManager.java:810)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at
原因:
OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode
设为FlushMode.NEVER。然后把该session绑定到
TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再解除该
session的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决
定是否关闭session。在这个过程中,若HibernateTemplate
发现当前session不是readOnly的transaction,就会获取到FlushMode.AUTO
Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为
Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush
model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
解决方法:
采用spring的事务声明,使方法受transaction控制
将方法
void importSupplyDoc(File file);
改为
@Transactional
void importSupplyDoc(File file);
分享到:
相关推荐
本文主要关注的是声明式事务管理,尤其是涉及到事务异常回滚的实例解析。 首先,Spring 默认只有在遇到未捕获的 `RuntimeException` 或其子类时才会触发事务回滚。这意味着,如果在业务代码中对异常进行了捕获并...
这里是事务异常回滚的地方,这里有个注意点是回滚会先用 rollbackOn 这个方法判断,默认情况下只有 RunTimeException 及 Error 是会进行回滚的,除非在@Transactional 显式声明了 rollbackFor。 二、Spring 的事务...
通常,我们可以配置全局事务异常处理器,例如使用@ControllerAdvice和@ExceptionHandler注解,来统一处理事务回滚和错误反馈。 7. **案例分析**:"SPRING事务管理案例分析.docx"很可能包含了具体的项目实例,详细...
事务处理和异常处理在保证数据库系统稳定性和数据一致性方面起着关键作用。Java提供不同的API来处理事务,如JDBC和JTA,以适应不同场景的需求。同时,通过异常处理机制,开发者能够优雅地处理运行时出现的问题,确保...
9. **事务异常处理**:在处理事务时,要特别注意捕获和处理异常,确保在出现错误时能够正确回滚事务。在Spring Boot中,可以使用@ControllerAdvice和@ExceptionHandler注解定义全局异常处理器,结合@Transactional...
通过学习这些源码,你可以更直观地理解如何在实际项目中应用上述知识,包括如何配置事务管理、如何处理事务异常以及如何优化事务性能。 总之,Spring框架的事务管理是其强大功能之一,掌握好Spring事务管理不仅可以...
通过运行这些例子,你将对Spring事务管理有更深入的理解,知道何时选择编程式还是声明式事务,以及如何有效地处理事务异常。 总之,Spring的事务管理是其强大功能的一部分,无论是编程式还是声明式,都能帮助开发者...
这是通过事务的日志记录和回滚机制实现的,当事务异常结束时,系统可以根据日志回滚到事务开始前的状态。 事务的并发控制是解决并发访问可能导致的问题的关键,包括: 1. 丢失修改:两个事务同时修改同一数据,...
Spring JDBC事务管理 ...Spring的事务管理机制提供了事务异常处理机制,开发人员可以根据需要捕捉和处理事务异常。 Spring的JDBC事务管理机制提供了灵活的配置选项和强大的事务管理机制,能够满足复杂的业务需求。
5. **事务异常回滚规则** - 默认情况下,只有运行时异常会导致事务回滚,检查异常(非运行时)不会。可以通过`@Transactional`的rollbackFor属性自定义回滚规则。 **三、结合使用** 在实际应用中,Spring的事务...
- **架构问题**:在设计分布式事务时,需要注意典型的设计问题,比如如何处理 XA 竞态条件,以避免事务异常终止等问题。 - **数据恢复**:在分布式事务中,数据恢复是一个关键问题。需要确保即使在出现故障的情况下...
5. **事务异常处理** 如果在回调函数中抛出未检查异常(继承自`RuntimeException`)或者`Error`,`TransactionTemplate`会自动回滚事务。而如果抛出已检查异常(非`RuntimeException`),则默认情况下事务会被提交...
子线程任务发生异常,主线程事务如何回滚? 本文将详细探讨当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚。下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多...
在ASP.NET中,事务处理和异常管理是两个非常重要的概念,对于保证应用程序的稳定性和数据一致性起着至关重要的作用。 **ASP.NET事务处理** 事务处理是数据库操作中的核心概念,它确保一组数据库操作要么全部成功,...
3. DAO层异常原因返回:在数据访问层,常见的异常有SQL查询错误、数据不存在、事务异常等。通过统一异常处理,可以将这些异常转换为自定义的异常,并附带具体的错误信息,如SQL错误码、影响行数等,这样可以清晰地...
5. **异常处理**:在分布式事务中,必须处理可能出现的事务异常,如HeuristicCompletionException、SystemException等。Spring提供了TransactionTemplate和PlatformTransactionManager接口,便于捕获和处理这些异常...
- **数据恢复**:设计合理的数据恢复策略,避免因事务异常导致的数据不一致。 总结来说,微服务处理分布式事务模块是解决微服务架构下数据一致性问题的关键技术,通过各种策略保证业务流程的完整性和数据的一致性。...
在Spring_day3_tx这个压缩包中,可能包含了一些关于Spring事务管理的示例代码或者教程资料,包括如何配置事务管理器、如何使用`@Transactional`注解、如何处理事务异常等内容。通过学习这些资料,你可以更深入地理解...
4. 事务异常处理 当事务中发生未检查异常(继承自RuntimeException的异常)或在@Transactional注解中指定的检查异常时,Spring会自动回滚事务。如果希望在特定异常下不回滚事务,可以使用`@Transactional(rollback...
在转账例子中,A和B的总金额不会因事务异常而改变。 3. 隔离性(Isolation):事务之间的操作不应互相干扰。MySQL提供了四种隔离级别来控制这一点: - 读未提交(READ UNCOMMITTED):允许脏读,事务能看到其他未...