mysql查询开启事务_MySQL中的查询事务问题

之前帮同学做个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

57219f25e18decb7224d92909b390d2a.png

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

mysql> set GOLBAL general_log=on;

mysql> show variables like %general%;

308187449cf78b8462b2fe2f819840fb.png

0d517dc87be58db3b53617ba3657123f.png

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

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

currentStudent = studentDAO.getStudentById(1);

sqlSession.commit();

System.out.println(currentStudent);

依然无效!!!

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

df034ff9b077c3bdf758baa5af7a4699.png

需要加入强制提交参数 true

currentStudent = studentDAO.getStudentById(1);

sqlSession.commit(true);

System.out.println(currentStudent);

加入后得到正确结果\:😄

cbb62aa1636a1d0e9d9678c045a8816e.png

总结

在MySQL中,查询也是一次事务,如果没有提交,则每次查询的结果都是相同的。然而建议的还是关闭自动提交(autocommit=0,但MySQL还是会自动开启一个事务,只是不提交),这样在向多个表中写数据时可以保证一致性;对于增删改操作而言,(在单个客户端中)可以在确认执行后的数据正确,再提交,相当于提前模拟一遍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过gparted 调整 ubuntu 磁盘

1. 启动和安装 1. 安装 sudo apt-get install gparted 2. 启动 sudo gparted2.配置 如果想扩充磁盘,需要有未分配空间,且该未分配空间位于partition相邻的格子

mysql增加布尔字段_JDBC对MySQL数据库布尔字段的操作方法

本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法。分享给大家供大家参考。具体分析如下:在Mysql数据库如果要使用布尔字段,而应该设置为BIT(1)类型此类型在Mysql中不能通过MySQLQueryBrowser下方的Edit与Apply Changed去编辑只能通过语句修改&#x…

linux查看mysql表空间使用率_Oracle查看数据库表空间使用情况sql语句

Oracle查看数据库表空间使用情况sql语句SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_…

mysql 不同服务器不同库之间的访问_不同服务器数据库之间的数据操作

--创建链接服务器exec sp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或ip地址 exec sp_addlinkedsrvlogin ITSV , false ,null, 用户名 , 密码 --查询示例select * from ITSV.数据库名.dbo.表名--导入示例select * into 表 from ITSV.数据库名.dbo.表名--以后不再使用…

mysql 禁止转义_必须转义哪些字符才能阻止(我的)SQL注入?

6 个答案:答案 0 :(得分:46)关于退格字符的猜测:想象一下,我发送了一封电子邮件“嗨,这是根据需要更新数据库的查询”和带有的附加文本文件INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);你捕获…

mysql 失效转移_MySQL基于MHA的FailOver过程

大家好,我是anyux。本文介绍MySQL基于MHA的FailOver过程。MHA FailOver过程详解什么是FailOver故障转移主库宕机,一直到业务恢复正常的处理过程如何处理FailOver1.快速监控到主库宕机2.选择新主节点,选择策略mysqladmin ping检查数据库状态&a…

mysql 设置 character_set_server_MySQL:简单记录character_set_server影响参数

Waiting for global read lock:由于flush table with read lock调用函数lock_global_read_lock导致DML操作堵塞。Waiting for commit lock :由于flush table with read lock 调用函数make_global_read_lock_block_commit导致事务不能提交现象堵塞COMMIT和…

mysql3.5.2 下载_mybatis 3.5.2 jar 下载

本文更新日期:2019年9月21日很多人找不到mybatis jar或者下载mybatis jar需要付积分,所以本页面给大家提供一个便捷的下载通道,敬请关注。一、mybatis 3.5.2版本下载:此压缩包包含文件:(1)mybatis-3.5.2.jar(2)mybatis…

kali 切换图形界面_kali Linux 文本图形界面切换遇到的怪问题

前段装了在Virtual Box上装一个Kali Linux玩,然后设为了开机进入文本界面,后来遇到无法上网的问题,网上找到解决方法,说是NAT地址转换和host-only双网卡顺序问题,按照网上的说法调整顺序后一切正常。问题及调整方法详见…

linux mysql更改生效_linux下面MySQL变量修改及生效

今天在访问mysql项目的时候突然报500错误,没有找到连接,因此想到mysql的连接时间。mysql> show global variables;主要就是连接时间是28800(8小时),而且任务调度也没打开,因此想到修改全局变量的值。1.修改任务调度装:1.1具体的…

linux刻录win10u盘_手把手教你装系统之【制作官方win10安装U盘】

本帖最后由 蚂蚁炒花甲 于 2019-11-11 22:58 编辑很多粉粉在收到linux版本的笔记本后用不惯,但又不知道如何装win10系统下面我就来教大家,如何自己动手 制作win10 安装U盘想学习的粉粉们,可以跟着我 学习下手把手教你装系统之【官方win10 U盘…

mysql 数据仓库 元数据_数据仓库中的元数据管理

1. 引言元数据是数据仓库中的一个重要组成部分,元数据管理系统则是构建,管理,维护和使用数据仓库系统的核心部件。2. 基础知识2.1 元数据的定义元数据是指来自企业内外的所有物理数据和知识,包括物理数据的格式,技术和…

python列表有固定大小吗_如何在python中创建固定大小的列表?

(tl;dr:对您的问题的确切答案是numpy.empty或numpy.empty_like,但是您可能不在乎,可以使用myList [None]*10000。)简单方法您可以将列表初始化为所有相同的元素。使用一个非数字值(如果以后使用它会给出一个错误,这是…

mysql 魔术设置_mysql主从复制实践

1.master服务器上安装mysql,正常安装mysql参考2.slave服务器上安装mysql,正常安装mysql参考3.配置3.1master服务器配置cnf文件vim /etc/my.cnf加入配置[mysqld]log-bin master-binlog-bin-index master-bin.indexserver-id 1重启mysql服务service mys…

mysql将时间戳转化为天数_mysql 将时间戳直接转换成日期时间

我的应用:select *,FROM_UNIXTIME(create_at, %Y-%m-%d) as date from stock转载原文:FROM_UNIXTIME( ):转为时间戳类型时间UNIX_TIMESTAMP( ) :返回长类型时间from_unixtime()是MySQL里的时间函数select uid,userid,username,email,FROM_UNIXTIME(addti…

centeros7安装mysql5.6_CentOS7安装MySQL5.6

1.安装包准备(MySQL官网下载)(1)查看MySQL是否安装,如果存在就先卸载[roothadoop101 桌面]# rpm -qa|grepMySQLmysql-libs-5.1.73-7.el6.x86_64[roothadoop101 桌面]# rpm-e --nodeps mysql-libs-5.1.73-7.el6.x86_64(2)查看mariadb是否安装,如果存在就先…

python中int和eval的区别_python中eval与int的区别浅析

python中eval和int的区别是什么?下面给大家介绍一下:1.eval()函数eval()能够以Python表达式的方式解析并执行字符串,并将返回结果输出。eval()函数将去掉字符串的两个引号,将其解释为一个变量。作用:a. 处理数字单引号&#xff0c…

scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据

本篇文章我们以抓取历史天气数据为例,简单说明数据抓取的两种方式:1、一般简单或者较小量的数据需求,我们以requests(selenum)beautiful的方式抓取数据2、当我们需要的数据量较多时,建议采用scrapy框架进行数据采集,sc…

mysql 第二天数据_MySQL入门第二天------数据库操作

一、基本命令1、启动服务器cmdnet start [服务器名称]net start mysql572、停止服务器cmdnet stop [服务器名称]net stop mysql573、链接数据库mysql -u 用户名 -p 登录密码mysql -u root -p4、退出登录quitexit\q5、查看版本(连接后执行)select version();6、查看当前时间(连接…

mysql 回退查询_MySQL数据库:第十章:分页查询

引入:实际的开发时,一页往往显示不全所有数据,则用到了分页查询语法:select 查询列表 ⑥from 表 ①【join 表 ②on 连接条件 ③where 筛选 ④group by 分组 ⑤having 分组后筛选 ⑦order by 排序列表 ⑧】limit 【起始条目数,】查…