1. Grails2.4自动生成的Controller会为类加上只读事务的注解,如下:
@Transactional(readOnly = true)
class Domain1Controller {
...
这会导致连接事务型数据库(如MySQL)进行读写操作的方法必须显示的加上开启读写事务(缺省为读写)的声明,否则会报异常:Connection is read-only. Queries leading to data modification are not allowed
@Transactional def save(Domain1 domain1Instance) {
...
给类加事务声明会强制新增的每个方法使用事务,不想使用事务只能把类声明处的@Transactional注解删除。
2. Grails2.4自动生成的Service也加了事务声明,但缺省是读写的,如下:
@Transactional class Domain1Service {
...
3. Grails2.4的Service中有两个方法save1和save2,save1中调用了save2。如果save1声明为只读事务,即使save2声明为读写事务,也会导致异常:Connection is read-only. Queries leading to data modification are not allowed。
同样的,controller中某声明为只读事务的方法,调用声明为读写事务的service1.save2,也会导致只读连接不允许写的异常。
这说明事务状态以最初的入口函数为准。
4. 都知道的如果需要回滚,必须人工抛出RuntimeException,而不是其他类型的异常。
5. 事务内发生的任何数据库操作,即使调用了flush:true,也不会立即写入数据库。只有当事务被提交的时候(并且flush?)才会被写入数据库。
6. 待续