之前帮同学做个app的后台,使用了MySQL+MyBatis,遇到了一个查询提交的问题,卡了很久,现在有时间了来复盘下

环境情况

假设有学生表:

USE test;

CREATE TABLE `student` (

Id int NOT NULL PRIMARY KEY AUTO_INCREMENT,

Name varchar(20) NOT NULL,

Grade int NOT NULL

)

mybatis项目目录的大致结构为:

+---src

| +---main

| | +---java

| | | | Test.java

| | | |

| | | +---pojo

| | | | Student.java

| | | |

| | | \---dao

| | | IStudentDao.java

| | |

| | \---resources

| | | log4j.properties

| | | mybatis-config.xml

| | |

| | \---mappers

| | StudentMapper.xml

Test.java

import dao.IStudentDao;

import pojo.Student;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test {

public static void main(String args[]) throws Exception{

String resource ="mybatis-config.xml";

InputStream is = Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

SqlSession sqlSession = sqlSessionFactory.openSession();

IStudentDao studentDAO = sqlSession.getMapper(IStudentDao.class);

Student currentStudent;

currentStudent = studentDAO.getStudentById(1);

System.out.println(currentStudent);

Thread.sleep(1000 * 30);

currentStudent = studentDAO.getStudentById(1);

System.out.println(currentStudent);

}

}

Student.java

package pojo;

public class Student {

private int id;

private String name;

private int grade;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

public int getGrade() {

return this.grade;

}

public void setGrade(int grade) {

this.grade = grade;

}

@Override

public String toString(){

return

"id = " + id + "\t" + "name = " + name + "\t" + "grade = " + grade + "\t";

}

}

IStudentDao

package dao;

import org.apache.ibatis.annotations.Param;

import pojo.Student;

public interface IStudentDao {

public Student getStudentById(@Param("studentId") int studentId);

}

mybatis-config.xml

StudentMapper.xml

SELECT id AS id, name AS name, grade AS grade

FROM student

WHERE id = #{studentId} ;

问题复盘

在第一次查询后,主线程暂停30秒,此时在MySQL WorkBench中修改了原来的数据,将“张三”变成“张三123”,主线程恢复后数据并没有任何变化。

开始以为是缓存问题,遂在mybatis-config.xml中禁用一级缓存:在configuration标签中,在 properties标签之后加入

问题依旧(注意看时间的变化,确实进行了更新,查询的数据确实没有变化)

16:03:43UPDATE test.student SET name = '张三123' WHERE id = 11 row(s) affected Rows matched: 1 Changed: 1 Warnings: 00.062 sec

开启mysql的查询日志比较差别

mysql> set GOLBAL general_log=on;

mysql> show variables like %general%;

注意:在我们的MyBatis中autocommit被设置为0,MySQL WorkBench中autocommit被设置为1

此时重新还原数据库数据,在Test.java手工加入提交

currentStudent = studentDAO.getStudentById(1);

sqlSession.commit();

System.out.println(currentStudent);

依然无效!!!

回顾一下,自动提交的问题确实存在,思路并没有问题。因此查询mybatis文档。

需要加入强制提交参数 true

currentStudent = studentDAO.getStudentById(1);

sqlSession.commit(true);

System.out.println(currentStudent);

加入后得到正确结果\:

mysql查询开启事务_MySQL中的查询事务问题相关推荐

  1. mysql慢日志查询的阈值_mysql慢日志查询

    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句.例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志 ...

  2. mysql正确打开方式_MySQL中MVCC的正确打开方式

    最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号.删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的.经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解了 ...

  3. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  4. 如何处理SQL Server事务复制中的大事务操作

    如何处理SQL Server事务复制中的大事务操作 事务复制的工作机制 事务复制是由 SQL Server 快照代理.日志读取器代理和分发代理实现的.快照代理准备快照文件(其中包含了已发布表和数据库对 ...

  5. mysql同步三张表如何用事务_MySQL 多表查询与事务的操作

    表连接查询 什么是多表查询 # 数据准备 # 多表查询的作用 * 比如:我们想查询孙悟空的名字和他所在的部门的名字,则需要使用多表查询 # 如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表 ...

  6. mysql中怎么查询单行单列_MySql中的子查询-结果单行单列

    MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...

  7. php mysql 时间戳查询_mysql中时间查询函数(包括时间戳)

    mysql中时间查询函数(包括时间戳) 这些函数都是MySQL自带的,可以直接使用在PHP写的MySQL查询语句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURR ...

  8. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  9. mysql的英文字母_MySQL中查询的有关英文字母大小写问题的分析

    mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的. 1. 什么是字符集和校验规则? 字符集是 ...

最新文章

  1. 华为、小米的新手机用了更多AI,到底谁更胜一筹?
  2. 用C编写的诙谐幽默的关机程序。
  3. 编译安装LNMP Centos 6.5 x64(6.6 x64) + Nginx1.6.0 + PHP5.5.13 + Mysql5.6.19
  4. 转: Fedora 17 安装flash插件
  5. Java 面向对象的设计思维
  6. php没有上级分类的联动,ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单...
  7. Linux-Shell编程之数组操作
  8. c语言不借助其他变量交换a b的值,C++面试题之数a、b的值互换(不使用中间变量)...
  9. 计算机会计凭证审核,记账凭证的审核
  10. Linux系统用户添加到用户组
  11. 计算机网络五层模型(ing)
  12. python定义一个字符串变量_python基础入门语法和变量类型(一)
  13. 爱因斯坦:三篇著名演讲
  14. 互联网没有基业长青?(转)
  15. 那些老牌互联网公司现在都混得怎样了?
  16. 加载调用本地百度地图资源,附地图下载器及黑龙江省1-16级瓦片地图,加载显示marker
  17. 巴西龟饲养日志----半年捉鱼经验总结
  18. dk 识别物体出现的问题
  19. 使用git拉取项目、创建分支、提交代码教程
  20. 机器学习笔记 - 时间序列使用机器学习进行预测

热门文章

  1. 服务器ssr进程启动怎么运行,要SSR? NUXT项目从初始化到部署服务器流程全记录
  2. Java反射基础(三)--Methods对象的使用
  3. mysql分页查询报错,及解决
  4. 水晶报表中对某一栏位值进行处理_合并报表——非同一控制下的企业合并amp;同一控制下的企业合并...
  5. 计算机论文的的格式,计算机论文格式模板.doc
  6. cad与连接mySQL数据库_跨服务器操作数据库?其实很简单!(下)
  7. 枚举算法称硬币C语言,【算法系列之枚举】称硬币
  8. 静态ip ssh无法登录_识别动静态IP的技巧
  9. Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...
  10. minitab怎么算西格玛水平_六西格玛黑带培训工具因子分析的使用