`
duben
  • 浏览: 50774 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

异常:Write operations are not allowed in read-only mode (FlushMode.NEVER)

阅读更多
我用Spring的声明事务,增加一个业务功能<关闭问题>时,我出现了异常:
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition

查了错误原理:在业务层dao.update(quesModel)中getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到 TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该 sessionFactory的绑定,最后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保护的方法有写权限,没受保护的则没有。
我的解决方式是:
1.将singleSession设为false,缺点是Hibernate Session的Instance可能会大增,使用的JDBC Connection量也会大增,如果Connection Pool的maxPoolSize设得太小,很容易就出问题。此办法放弃。
2.我的resovedQuesWithNoOkAnswer方法没有写权限,这时方法内有update操作,则需要手动设置flush model为Flush.AUTO,如
session.setFlushMode(FlushMode.AUTO); 
session.save(user); 
session.flush();

设置后还是出现同样的问题,不知道是不是Session有没有正确的获取到的原因.
3.Extend OpenSessionInViewFilter,Override protected Session getSession(SessionFactory sessionFactory),将FlushMode直接改为Auto。这种方法很麻烦,并且重写后要重新全部编译。
4.检查事务管理配置(applicationContext.xml)
		<property name="transactionAttributes">
			<props>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="add*">PROPAGATION_REQUIRED</prop>
				<prop key="insert*">PROPAGATION_REQUIRED</prop>
				<prop key="remove*">PROPAGATION_REQUIRED</prop>
				<prop key="set*">PROPAGATION_REQUIRED</prop>
				<prop key="login*">PROPAGATION_REQUIRED</prop>
				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
			</props>
		</property>

我的方法以resoved开头的不可操作数据库(更新数据库),
它默认进行了PROPAGATION_REQUIRED, readOnly方式处理,我手动再添加一个
			<prop key="resoved*">PROPAGATION_REQUIRED</prop>

重启服务,问题就解决了。
分享到:
评论
2 楼 duben 2010-06-25  
这还是老版本的spring 配置方式,用aop声明性事务配置用方便,annotation配置不会,以后再学习。
1 楼 五月天 2010-06-19  
对于通过xml配置的事务,一般要注意方法名的约束,如所有的添加操作均以add开始,所有的删除操作均以del开始。。。以get开始的操作均设置为readOnly事务,不过这样显然很死板,不过现在可以通过Annotation配置事务,一个Transaction注解解决所有的问题,呵呵,可以好好的学下,提高效率!

相关推荐

    使用Spring引起的错误

    使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVER) 错误解决

    springmodules-cache.xsd&springmodules-ehcache.xsd.rar

    xml/ns/javaee":deferred-syntax-allowed-as-literal, "http://java.sun.com/xml/ns/javaee":trim-directive-whitespaces, "http://java.sun.com/xml/ns/javaee":default-content-type, ...

    webgoat-standalone-7.1-SNAPSHOT-exec.jar

    Prerequisites: Java VM 1.8 Open a command shell/window, browse to where you ...Using the --help option will show the allowed command line arguments. 更多查看: https://github.com/WebGoat/WebGoat

    net55-r8168-8.045a-napi.x86_64.rar

    2015-01-16: Version 8.039.01: Changed driver code to not use IP checksum hardware offload (caused various issues with networking in VMs) 2015-01-05: Version 8.039.00: Original version

    sciter-sdk-4.0.0.7

    NOTE: Windows executables in SDK are not signed so you may encounter security warnings on W8 and W10. On MacOS you may need to run SDK executables directly from console as they are not signed too.

    net51-r8169-6.011.00-2vft.510.0.0.799733.x86_64.rar

    在线封装和离线封装驱动 ... Description ...Adds the blacklisted ESXi 5.1 built-in ...Requires MaintMode Live Install Allowed Live Remove Allowed Stateless Ready Overlay Yes No No Yes No

    net-e1000e-3.1.0.2-glr2.x86_64.rar

    Requires MaintMode Live Install Allowed Live Remove Allowed Stateless Ready Overlay Yes No No Yes No Additional links Related VMware Forum's post Package updated to include missing device IDs 1502...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    When True then in ftmPanning mode will be shown only cached image of the initial client area. All parts outside will paints of the TFlexPanel.Brush. When returning from ftmPanning mode the complete ...

    sciter-sdk-4.0.3.5348

    NOTE: sciter.dlls, sciter.exe and notes.exe Windows executables in SDK are digitally signed now. On MacOS you may need to run SDK executables directly from console as they are not signed too.

    net-tulip-1.1.15-1.x86_64.rar

    Requires MaintMode Live Install Allowed Live Remove Allowed Stateless Ready Overlay Yes No No Yes No Additional links VMware Communities thread about running VMware ESXi inside Hyper-V Build ...

    开源项目-pawelad-just-scored.zip

    开源项目-pawelad-just-scored.zip,为世界杯球迷提供lambda动力的Slack应用程序

    Diskeeper 2008 v12.0.759.0

    directories that will not be allowed to be processed by Diskeeper. Event Logging ------------- Diskeeper records information about its activity in two ways. First, general information about ...

    NIST SP800-76-2.pdf

    This document contains technical specifications for biometric data mandated or allowed in [FIPS]. These specifications reflect the design goals of interoperability, performance and security of the PIV...

    No operations allowed after statement closed.

    解决:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed.

    NR5G网络拒绝码-5gmm_cause = 27 (0x1b) (N1 mode not allowed).docx

    从3GPP协议和UE端行为分析5G gmm cause #27的网络问题

    wp-o-matic.1.0RC4.zip

    Use the post template feature -located in campaign settings-. For example: {content} &lt;p&gt;&lt;a &gt;Link to the original site&lt;/a&gt;&lt;/p&gt; = Why isn’t the full article showing? = Because the feed you're using ...

    NFS服务器客户机配置

    实验报告 一、 实验名称:NFS服务器及客户机配置 二、 实验目的:NFS服务器共享目录,客户机可以进行访问 三、 实验步骤: (1) NFS服务器: 1.#vi /etc/sysconfig/network-scripts/ifcfg-eth0进行IP地址配置。...

    fastboot 2020年 android10版本 ubuntu linux平台

    Check whether unlocking is allowed (1) or not(0). advanced: erase PARTITION Erase a flash partition. format[:FS_TYPE[:SIZE]] PARTITION Format a flash partition. set_active SLOT Set the active ...

    thymeleaf-extras-springsecurity-3.0-master.zip

    In fact, you are allowed to surround your access expression with ${...} if it makes you feel more comfortable: &lt;div sec:authorize="${hasRole(#vars.expectedRole)}"&gt; This will only be displayed if ...

    Ethercat-Ighmaster.txt

    to select, ranges are allowed. Examples: '1,3', '5-7,9', '-3'. Default: '-' (all). --force -f Force a command. --quiet -q Output less information. --verbose -v ...

Global site tag (gtag.js) - Google Analytics