文档章节

mysql autocommit的差异

x
 xiangel
发布于 2015/05/17 19:29
字数 632
阅读 253
收藏 2

用python在开发一个小web站点时碰到一个问题,通过mysql客户端修改库中数据后(有做提交),在前台web页面刷新还是以前的数据。而另开一个mysql客户端查询是可以查询到值的。重启web服务后可以看到新值。而同样使用java的jdbc方式连接时同样的方式是可以看到新值的。

于是决定开启mysql的日志看看实际运行的SQL有什么差异.

先看python连接方式的:

150517 13:34:00     3 Connect   root@localhost on dw
                    3 Query     SET NAMES 'utf8' COLLATE 'utf8_general_ci'
                    3 Query     SET @@session.autocommit = OFF
                    3 Query     select id,name from job where id=5
150517 13:34:20     3 Query     select id,name from job where id=5
                    3 Quit

再来看看java的:

150517 13:39:08     5 Connect   root@localhost on dw
                    5 Query     /* mysql-connector-java-5.1.25 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'ne
t_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set
_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation'
OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower
_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' O
R Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'
                    5 Query     /* mysql-connector-java-5.1.25 ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment
                    5 Query     SHOW COLLATION
                    5 Query     SET NAMES latin1
                    5 Query     SET character_set_results = NULL
                    5 Query     SET autocommit=1
150517 13:39:09     5 Query     select id,name from job where id=5
150517 13:39:29     5 Query     select id,name from job where id=5
                    5 Quit

乍一看上去觉得差不多,没什么差异。很是苦闷,于是再想另外的方法。启动2个python脚本来尝试,一个写,另一个读。

结果发现读的那个脚本可以马上读到新增的数据。于是对比了下读的脚本发现每次读完后有做commit。把commit去掉再试,问题重现。再回过头去看了下python脚本和java脚本生成的mysql日志的差异。发现

python:
 3 Query     SET @@session.autocommit = OFF
java:
5 Query     SET autocommit=1

查询mysql的文档

The autocommit mode. If set to 1, all changes to a table take effect immediately. If set to 0, you must use COMMITto accept a transaction or ROLLBACK to cancel it

autocommit=1时为自动提交即autocommit=ON.

接下来尝试了下postgresql,在autocommit=False时是可以查看到新数据的。

在看postgresql的python驱动的文档时发现有个不错的提示,转帖如下:

Warning

 

By default, any query execution, including a simple SELECT will start a transaction: for long-running programs, if no further action is taken, the session will remain “idle in transaction”, a condition non desiderable for several reasons (locks are held by the session, tables bloat...). For long lived scripts, either ensure to terminate a transaction as soon as possible or use an autocommit connection.


© 著作权归作者所有

共有 人打赏支持
x
粉丝 2
博文 8
码字总数 16097
作品 0
武汉
私信 提问
mysql之innodb引擎使用方法

前言 闲来无事做不如MySQL。 一.简介: 1.Linux下使用MySQL数据库时,为了支持事务操作需要用到InnoDB引擎,对于表中处理的插入,更新等操作失败时 ,回滚前面不应该完成的操作是必须的. 2.一般M...

李伟铭k
07/09
0
0
【整理】MySQL 之 autocommit

mysql 默认是开启 auto commit 的。可以通过如下命令查看 session 级别和 global 级别的设置: mysql> select @@session.autocommit;+----------------------+| @@session.autocommit |+----......

摩云飞
2013/10/18
0
0
mysql存储过程包含事物的处理

mysql存储过程,包含:事物、in/out DROP PROCEDURE procuserregister;DELIMITER $$CREATE DELIMITER ; 使用:CALL procuserregister ('aaa','e2e2','aaa@q1.com',14874784,@msg);SELECT @m......

hanzhankang
2013/11/25
0
3
mysql api---从一个小例子开始mysql编程入门(6)

先了解几个概念: MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 set autocommit=0 禁止自动提交 set autocommit=1 开启自动提交 mysql中INNODB引擎才支持事务...

baiweibi
10/30
0
0
MySQL · 捉虫动态 · 5.7 mysql_upgrade 元数据锁等待

问题描述 如下图,mysqlupgrade 过程中,执行 DROP DATABASE IF EXISTS performanceschema 一直在等待 metadata lock 问题排查 简单粗暴的方法 有一种简单的解决方法,把其他连接kill掉,释放...

阿里云RDS-数据库内核组
2017/04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux脚本中父shell与子shell 执行的几种方式

本文主要介绍以下几个命令的区别: shell subshell source $ (commond) `commond` Linux执行Scripts有两种方式,主要区别在于是否建立subshell 1. source filename or . filename 不创建sub...

问题终结者
16分钟前
1
0
安装jdk和Tomcat

12月12日任务 16.1 Tomcat介绍 16.2 安装jdk 16.3 安装Tomcat Tomcat介绍 Tomcat是apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由apache、Sun和其他一些...

robertt15
17分钟前
3
0
Beetl 免费视频

来自 https://my.oschina.net/gking?q=Beetl ,Beetl终于有人录制视频了 项目git地址:https://gitee.com/gavink/beetl-blog 视频地址:下载下来会更清晰,视频比较长,可使用倍速看 百度网盘...

闲大赋
29分钟前
0
0
isEmpty和null的区别

isEmpty和null的区别: 1.一个是对象为空(IsNull),一个是值为空(IsEmpty) 2.IsNull指任务类型变量是否为空包括对象类型的变量。 IsNull函数: 功能:返回Boolean的值,指明表达是否不包...

DemonsI
56分钟前
3
0
Centos7 安装mysql与php

https://blog.csdn.net/qq_36431213/article/details/79576025 官网下载安装mysql-server 依次使用下面三个命令安装 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.r......

Yao--靠自己
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部