Write operations are not allowed in read-only mode (FlushMode.MANUAL) 的解决办法


问题描述:

    近期根据需求架构了一个小型项目,由于是公司内部使用,没有考虑三高(即高并发、高可用、高扩展),所以使用了SSH(Spring\Struts\Hibernate)进行开发的,主体架构完成后,进行的第一个操作就遇到了一个问题,内容如下:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.


如下图所示:




问题分析:

    在我的Web.xml中配置了 “ OpenSessionInViewFilter ”过滤器,主要用来解决 Hibernate 在项目中出现的懒加载问题(当请求来的时候,才开启事物,请求结束后立即关闭事物,默认为手动开始,我们需要设置其为提交/自动的),如下图:


    根据错误信息提示:开启“ OpenSessionInViewFilter ”这个过滤器的时候FlushMode 就已经被默认设置为了 MANUAL,如果 FlushMode 是 MANUAL,在操作过程中 hibernate 会将事务设置为 readonly,在操作数据时就会出现如上的错误。


解决方案:

其实在异常信息的后面已经给出了两解决方案,如下:

方案一:

修改 FlushMode 的值为 COMMIT/AUTO,在项目的核心配置文件Web.xml中添加内容:

		<init-param>
			<param-name>flushMode</param-name>
			<param-value>AUTO</param-value>
		</init-param>


如下图:



方案二:

从事务定义中删除“ 只读 ” 标记,在Spring的核心配置文件中,找到 </tx:advice> 的节点,如下图:



    在该节点中找到操作的事物定义,直接删除掉即可,如:新增则删掉新增的事务定义,修改则删掉修改的事务定义即可。










好了,关于 Write operations are not allowed in read-only mode (FlushMode.MANUAL)  的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,可以给我留言。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值