有时候,我们会看到代码里面,有如下语句:
@Transactional(ReadOnly=true)
是不是没有用处呢?
其实是有用处的,mysql支持只读事务的。
- 只读事务内,不能增加、修改、删除内容,否则报Cannot execute statement in a READ ONLY transaction。
- 只读事务内,只能读取到执行时间点前的内容,期间修改的内容不能读取到。
- 只读事务作为ORM框架优化执行的一个暗号,比如放弃加锁,或者flush never。
mysql5.6验证过程如下:
1. 建表
create table test(
id int not null default 0,
name varchar(10) not null default ”
) engine=innodb default charset=utf8;
insert into test values (1,’zhangsan’);
2. 开启只读事务
mysql> start transaction read only;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id=1;
+—-+———-+
| id | name |
+—-+———-+
| 1 | zhangsan |
+—-+———-+
1 row in set (0.00 sec)
3. 删除内容
mysql> delete from test where id=1;
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
报错,只读事务不支持删除内容。
4. 手动修改内容后再读取
mysql> update test set name = ‘ganbo’ where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test where id=1;
+—-+———-+
| id | name |
+—-+———-+
| 1 | zhangsan |
+—-+———-+
1 row in set (0.00 sec)
只读事务内被修改的内容,感知不到。
总结
- 只读事务的好处,作为ORM框架优化的暗号,保证读一致性,事务内不允许DML操作。
- 只读事务的场景,如统计,保证统计结果准确性。
- 缺点,使用事务,动态生成代理类,增加开销。