hibernate查詢報 Cannot execute statement in a READ ONLY transaction

 WARN [http-bio-8604-exec-1] org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler.logWarning(232) | SQL Warning Code: 1792, SQLState: 25006
WARN [http-bio-8604-exec-1] org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler.logWarning(233) | Cannot execute statement in a READ ONLY transaction. 
字面意思:不能執行只讀的事務 、
剛看到這個問題我跟鬱悶,網上百度一下,別人都是更新啊,我只查詢了啊,爲何還會報這個錯誤?還有爲何會限制只讀?
首先回答第二個問題:
<!-- 配置事務傳播 -->
    <tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true"  />
            <tx:method name="query*" read-only="true"  />
            <tx:method name="get*" read-only="true"  />
            <tx:method name="*" propagation="REQUIRED"  />
        </tx:attributes>
    </tx:advice>

因爲個人方法名是getXmlName,因此被限制成只讀了sql

第一個問題:首先看個人sql:數據庫

select CONCAT(CONCAT(date_format(now(),'%Y%m%d'),'-'),lpad(nextval('s_blog_account') + 100000, 6, '0')) from dual

下面爲nextval()函數的建立:函數

DROP FUNCTION IF EXISTS `nextval`; DELIMITER //  
  
CREATE  FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11) DETERMINISTIC BEGIN  
  
UPDATE sequence SET current_value = current_value + increment WHERE NAME = seq_name; RETURN currval(seq_name); END// DELIMITER ;

能夠看出每次調用nextval()函數都會更新更新數據庫,因此涉及到了事務.....spa

解決辦法:修改方法名,不以get、find、query開頭,或者修改配置文件註釋掉事務傳播(不建議);hibernate

相關文章
相關標籤/搜索