数据库事务:只读事务 作者:马育民 • 2024-02-11 15:46 • 阅读:10019 # 说明 事务分两种: - 读写事务(默认使用的事务) - 只读事务 本文讲解 **只读事务** ## 作用 - 只读事务中,不能执行 **增、删、改** 操作,否则报 `Cannot execute statement in a READ ONLY transaction` - 只读事务比读写事务更高效,因为不需要 **增、删、改 数据**,所以 **数据库做了优化**(具体依赖数据库) - 只读事务内,只能读取到执行时间点前的内容,期间修改的内容不能读取到([避免不可重复](https://www.malaoshi.top/show_1IX9gVCVzZP.html "避免不可重复")) - 设置只读事务,在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 原文出处:http://malaoshi.top/show_1IX78DdNub5M.html