数据库事务:只读事务

说明

事务分两种:

  • 读写事务(默认使用的事务)

  • 只读事务

本文讲解 只读事务

作用

  • 只读事务中,不能执行 增、删、改 操作,否则报 Cannot execute statement in a READ ONLY transaction

  • 只读事务比读写事务更高效,因为不需要 增、删、改 数据,所以 数据库做了优化(具体依赖数据库)

  • 只读事务内,只能读取到执行时间点前的内容,期间修改的内容不能读取到(避免不可重复)

  • 设置只读事务,在ORM框架(如:Mybatis)中,可以优化,比如放弃加锁,或者flush never。

应用场景

如果一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态

总结

一次执行多条查询语句,为了保证数据整体的一致性(即:避免不可重复读、幻读),应该 启用事务

又因为只是 执行多次查询,没有增删改操作,就应该指定 只读事务,提高性能

依赖数据库支持

只读事务 依赖数据库的支持,有的数据库 不支持只读事务

支持只读事务的数据库:

  • MySQL
  • Oracle

默认为读写事务,需要额外设置启用 只读事务

性能优化

由于只读事务 不存在数据的修改,因此数据库将会为只读事务提供一些 优化手段,例如:Oracle对于只读事务,不启动回滚段,不记录回滚log。

JDBC 关键代码

conn.setReadOnly(true);

参考:
https://blog.csdn.net/yulin_ganbo/article/details/78566835
https://blog.csdn.net/qq_35939417/article/details/112908831
https://blog.csdn.net/andyzhaojianhui/article/details/51984157


原文出处:/show_1IX78DdNub5M.html