事务是什么?事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

下面来看一个项目中遇到的问题:

有这么一个需求,我们要查询一些数据,但是在查询这个数据之前我们要往查询的表中插入一些数据,虽然这个需求有点愚蠢,但是难不到我们。

public class QueryStudentServiceImpl implements QueryStudentService {

    public List<Student> queryStudent(){
Student student = new Student();
insertStudent(student); //查询之前先插入
return studentDao.queryStudent(); //查询数据库
}
@Transactional
public void insertStudent(Student student) {
studentDao.insertStudent(student);
}
}

上面的代码看上去很完美也很简洁,但是经过测试发现查询出来的数据并没有把插入的数据一并查出来。那么问题到底出在哪里呢?难道是事务管理哪里出问题了?

事务又会分为 “读写事务”和“只读事务”,“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。Oracle默认情况下是没有事务控制的,即只能查询出语句执行前状态的数据,那么如果当你在做报表查询,两次查询结果可能会不一致。这个时候就可以用到只读事务。如果两条查询语句被一个只读事务包围,则两条查询结构就能保证一致性。也就是说只读事务开启期间数据库的变化是不会被查询出来。

说了这么多,跟上面的问题有什么关系呢,我的查询又没有开启只读事务?其实Spring事务控制是包含注解控制和xml配置控制。在通过各种方法查询,最后在核心层项目中找到了这么一段配置。

也就是说我们的query*方法被配置为只读事务,并且insert操作是发生在事务开启之后,所以导致查询不出插入的数据。

但是如果我一定要这么操作怎么办呢?也有办法,我们可以在queryStudent 方法前面 通过@Transactional(readOnly = false)来改变该方法的事务控制。并且建议将 insertStudent方法放到其他的bean中。因为调用同一个类中事务控制方法,会导致该事务失效。具体可以参考这篇文章

来源:梧州网站优化

Spring事务管理 —— readOnly只读事务的更多相关文章

  1. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  2. Spring事务管理——其他的事务属性

    之前我们说过Spring事务管理中的事务的传播行为的属性.下面我们来说一下它的其他属性. 一.事务的隔离级别 1 .数据库事务并发问题.假设现在有两个事务:Transaction01和Transact ...

  3. 二十 Spring的事务管理及其API&事务的传播行为,编程式&声明式(xml式&注解式,底层AOP),转账案例

    Spring提供两种事务方式:编程式和声明式(重点) 前者需要手写代码,后者通过配置实现. 事务的回顾: 事务:逻辑上的一组操作,组成这组事务的各个单元,要么全部成功,要么全部失败 事务的特性:ACI ...

  4. spring boot开启事务管理,使用事务的回滚机制,使两条插入语句一致

    spring boot 事务管理,使用事务的回滚机制 1:配置事务管理 在springboot 启动类中添加 @EnableTransactionManagement //开启事务管理 @Enable ...

  5. spring事务管理——编程式事务、声明式事务

    本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...

  6. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  7. Spring的事务管理和数据库事务相关知识

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱.         比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱. ...

  8. Spring事务管理5-----声明式事务管理(3)

    声明式事务管理  基于注解 在配置文件中需要开启注解驱动<tx:annotation-driven transaction-manager="transactionManager&qu ...

  9. Spring事务管理4-----声明式事务管理(2)

    声明式事务管理  基于AspectJ的 XML 方式配置 通过对事务管理器TransactionManager配置通知(增强),然后再配置切点和切面,详细见applicationContext.xml ...

随机推荐

  1. 自定义jqGrid编辑功能,当行获取焦点时编辑,失去焦点时保存

    http://www.360doc.com/content/17/0719/15/9200790_672577533.shtml /********************************** ...

  2. 留学英文论文写作Abstract三种类型

    所谓Abstract,就是对所写论文主要内容的精炼概括.Abstract是美国人的说法,英国的科技期刊喜欢称之为Summary.在英文中,有资料是这么对其定义的:Abstract is a sketc ...

  3. Java高级特性——注解,这也许是最简单易懂的文章了

    最近,浪尖在做flink的项目时source和sink的绑定那块用到了注解,当然新版本1.6以后就变为server load的方式加载. 但是浪尖也是觉得很有毕业讲一下注解,毕竟高级免试也会问答的吧. ...

  4. python爬取网页文本、图片

    从网页爬取文本信息: eg:从http://computer.swu.edu.cn/s/computer/kxyj2xsky/中爬取讲座信息(讲座时间和讲座名称) 注:如果要爬取的内容是多页的话,网址 ...

  5. 修改element-ui里table中悬浮框中三角号的颜色及透明度设置

    .el-tooltip__popper,.el-tooltip__popper.is-dark{background:rgba(0,0,0,0.6) !important;} .el-tooltip_ ...

  6. mysql 索引使用教程

    1.什么索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. ...

  7. HDU - 5591 ZYB's Game(博弈)

    题意:A和B两人在1~N中选数字.已知1<=X<=N,谁先选中X谁就输.每当一个人选出一个不是X的数,裁判都会说明这个数比X大还是小,与此同时,可选范围随之缩小.已知A先选,求满足能让B赢 ...

  8. 洛谷 P1043 数字游戏

    题目传送门 解题思路: 跟石子合并差不多,区间DP(环形),用f[i][j][s]表示从i到j分成s段所能获得的最大答案,枚举断点k,则f[i][j][s] = min(f[i][j][s],f[i] ...

  9. js 一年中多个时间段 天数去重

    Date.prototype.format = function() { var s = ''; var mouth = (this.getMonth() + 1)>=10?(this.getM ...

  10. 用Python读取一个文本文件并统计词频

    刚刚在写文章时360浏览器崩溃了,结果内容还是找回来了,感谢博客园的自动保存功能!!! ------------恢复内容开始------------ 最近在学习Python,自己写了一个小程序,可以从 ...