在学习spring事务的时候,发现设置readOnly后不启作用。
查阅资料后发现对spring事务中readOnly的定义理解有错,与oracle中的事务隔离级别read-only混淆。
oracle中的事务隔离级别定义:只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行 INSERT , UPDATE ,及 DELETE 语句。
spring中readOnly的定义:This just serves as a hint for the actual transaction subsystem;it will not necessarily cause failure of write access attempts.
spring的readOnly事务是对java中jdbc的封装,java中connection.setReadOnly(boolean)的定义:Puts this connection in read-only mode as a hint to the driver to enable database optimizations.
结论:spring中readOnly的定义,并不是不能在事务中进行修改等DML操作,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。