工程中默认使用声明式事务,事务控制在service层,规则定义在transaction.xml文件中
* 以select、query、get等开头的方法为只读事务
* 以insert、create、save、do等开头的方法走事务
所以当控制台报Connection is read-only错误时就要注意下service中方法开头了
```
Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
```
transaction.xml文件内容
```
<!-- Spring 通知配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="select*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="load*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="insert*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="create*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="save*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="submit*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="update*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="modify*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="del*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="remove" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="do*" read-only="false" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- Spring 事务切面配置 -->
<aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* org.walkframework.base.mvc.service.*.*.*(..)) or execution(* org.walkframework.base.mvc.service.*.*.*.*(..)) or execution(* com.asiainfo.walk.*.mvc.service.*.*.*(..)) or execution(* com.asiainfo.walk.*.mvc.service.*.*.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config>
```
**注意:** 当数据库是mysql时,如果发现方法开头也对,代码任何地方也没问题,但事务始终就是不生效时,这时就要注意下表的存储引擎类型了,MyISAM是不支持事务的,可考虑改成InnoDB类型
- walk简介
- 核心模块
- walk-data
- IData
- EntityHelper
- walk-cache
- 缓存管理器
- 缓存对象
- 缓存注解
- walk-batis
- 单表操作
- 批量操作
- 列表/分页查询
- 所有方法列表
- sql热部署
- 二级缓存
- 数据库方言
- 其他使用技巧
- 实体类生成工具
- walk-mq
- 队列管理器
- 队列对象
- 订阅/发布管理器
- 订阅器
- 发布器
- walk-shiro
- 用户认证/授权
- url动态授权/回收
- 分布式会话
- 无状态会话支持
- walk-base
- 前端基础框架
- 公共页面
- 自定义标签
- 自定义函数
- 组件及工具
- 后端基础框架
- 基础结构
- 表单校验
- 数据导入
- 数据导出
- 上传下载
- 静态参数加载器
- 静态参数翻译器
- 实体类翻译器
- sql翻译器
- 自定义翻译器
- 静态参数校验器
- 分布式任务
- 增删改查代码生成器
- walk-restful
- 请求报文
- 返回报文
- 节点翻译器
- api代码生成
- walk-activiti
- 接口封装
- 模型管理
- 流程图展示
- 集成方法
- walk-console
- 在线会话管理
- 静态参数表缓存管理
- 缓存管理
- 队列管理
- 发布/订阅管理
- walk-boot
- 常用功能
- 持久层操作
- 分布式缓存
- 分布式会话
- 分布式任务
- 前端常用功能
- 后端常用功能
- 工作流封装
- 多数据源支持
- 关于读写分离
- 常用工具类
- 代码生成工具
- SpringCloud集成
- 阿里edas平台支持
- 其他
- 开发规约
- 环境要求
- 工程示例
- 工程结构
- web工程
- API工程
- 后台任务
- 常见问题
- 事务不生效
- 分布式任务不生效
- 事务锁
- 变更历史