`
fruwei
  • 浏览: 14297 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Mysql 自动提交对查询带来的影响

阅读更多
在数据库应用编程中,通常为了修改语句的执行效率会将数据库的自动提交模式关闭,然后采用事务的方式提交更改。然后问题就来了,下面是一段被精简的程序,用的是Mysql C API:
    MYSQL *conn=mysql_init(NULL);
    mysql_real_connect(conn,"198.120.0.199","shr","shr","sp5000",3306,NULL,0);
    int num = 2;
    char sql[512] = "select name from aaa";
    MYSQL_STMT *stmt;
    MYSQL_BIND  column[1];
    mysql_autocommit(conn, 0);  //设置自动提交关闭
   stmt = mysql_stmt_init(conn);
   for(int jj=0;jj<100;jj++){
        mysql_stmt_prepare(stmt,sql,strlen(sql);
        mysql_stmt_execute(stmt);
        memset(column,0,sizeof(column));
        unsigned long length[1];
        my_bool is_null[1];
        char name[100];

        column[0].buffer_type = MYSQL_TYPE_VAR_STRING;
        column[0].buffer =(char *)name;
        column[0].buffer_length = 100;
        column[0].is_null= &is_null[0];
        column[0].length = &length[0];

        mysql_stmt_bind_result(stmt,column);
        mysql_stmt_store_result(stmt);
        while(true){
            rel=mysql_stmt_fetch(stmt);
            if(rel!=0)  break;
            printf("data: %s  \n",name);
        }
        getchar();
    }
	mysql_stmt_free_result(stmt);
    mysql_stmt_close(stmt);

    mysql默认是自动提交,通过 mysql_autocommit(conn, 0)将自动关闭关闭。在循环查询中发现每次查询的结果都一样!尽管在其他地方修改了这张表并提交成功,当然每次程序重新启动的第一次还是能正确读取到数据。我一开始以为是mysql缓存带来的影响,因此将mysql的缓存关闭,但是发现还是同样的问题。好吧接着我索性就把
stmt =mysql_stmt_init(conn);
mysql_stmt_free_result(stmt);
mysql_stmt_close(stmt);
这三句代码移动到了循环内部,我每次生成新的查询对象,但是结果还是让我失望了。百思不得其解时我注释掉了所有能注释的语句,最终被我注释了 mysql_autocommit(conn, 0),然后一切都正常了,每次查询都是最新的表内容。
    自动提交对select竟然也有影响!但是我又不能不禁用自动提交,如何解决这个问题呢。因为程序是从oracle换成mysql而改写的,提一下oracle,程序采用的是OCI库,其中OCIStmtExecute执行sql语句时通过第八个参数(oci的函数参数都是多的...)mode来决定立即提交还是等显示调用commit后提交,默认的是非自动提交,对于select语句参数同样设置的是default模式,的确select语句需要提交吗?在各种数据库的查询过程中,我们敲一行select语句之后并不需要commit,大多数数据库都是这样的。
    但是mysql偏偏不是这样,难道真的要提交,于是我在mysql_stmt_prepare(stmt,sql,strlen(sql);之后添加了提交代码:   mysql_commit(conn);问题顿时解决了,再循环查询中数据库的变动也能立即查询到了!
    然后我打开mysql终端测试了下基本的查询,发现mysql cmd中存在同样的现象。大家可以根据我下面的步骤简单的测试下:打开终端A连上mysql,对于每个连接其默认的提交模式是自动提交,可输入命令show variables like 'autocommit';查看其默认是
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
    输入命令set session autocommit = 0;将自动提交关闭,这时再查看参数为OFF,然后查询一张表;另开一个终端B对表数据进行修改并提交;返回终端A重复查询,可以发现其结果始终未变!然后默默的敲上commit;再次查询一次结果才是最新的表数据!也就是说我们查询一个表需要select....;commit;select....;这样的语句才能实时查询出结果!Mysql版本是5.5。
    来看一下oracle,sqlplus连上数据库,输入show autocommit,显示默认为OFF(如果为ON,通过et autocommit off关闭),重复上面的测试,oracle虽然自动提交为OFF但是对于select并未有mysql的现象。
    对于select读操作,oracle和mysql在自动提交设置关闭的情况下有着不同的处理,读操作是否需要提交,读虽然也算的上是一个事务,但是就像select....;commit;select....;这样才能查到正确数据的写法未免让人感觉别扭!先记住吧,以后有时间试下MYSQL C++ 类库或JDBC,看下是否有改变。
分享到:
评论

相关推荐

    JDBC设置事务自动提交

    本篇文章将深入探讨如何使用JDBC设置事务的自动提交模式,以及它的工作原理和重要性。 首先,理解事务的基本概念至关重要。事务是数据库执行的一组操作,这些操作要么全部完成,要么全部不完成,即遵循ACID(原子性...

    mysql关于隐式提交的问题

    **隐式提交**是指在没有显式使用`COMMIT`命令的情况下,MySQL自动提交当前事务的行为。这种行为可能会导致预期之外的数据变更,尤其是在使用自动提交模式时更需注意。 #### 三、触发隐式提交的操作 根据提供的部分...

    mysql 分库分表查询工具-shard.zip

    MySQL 分库分表查询工具——Shard 在大型的互联网应用中,数据库的性能瓶颈往往成为系统扩展性的关键因素。为了应对高并发、大数据量的挑战,MySQL 数据库的分库分表策略被广泛采用。分库是将数据分散到多个独立的...

    mysql怎么减少行锁对性能的影响

    ### MySQL如何减少行锁对性能的影响 在MySQL数据库中,行锁是一种重要的锁定机制,它主要应用于InnoDB存储引擎中,用于控制并发事务对数据行的访问。行锁的使用可以显著提高系统的并发处理能力,但同时也会带来一定...

    Mysql自动发备份恢复

    MySQL数据库在业务运行中起着至...通过以上知识,你可以建立一个可靠的MySQL自动备份恢复系统,有效保护数据安全,减少因数据丢失带来的风险。记住,良好的备份策略是任何业务的基石,务必重视并定期审查你的备份流程。

    mysql45讲.zip

    19. **MySQL最新特性**:介绍MySQL的新版本带来的新功能,如GTID(全局事务ID)和半同步复制等。 20. **高可用与容灾**:讨论MySQL的高可用架构,如Multi-Master、Percona XtraDB Cluster等。 每个主题都可能包含...

    实例讲解MYSQL数据库的查询优化技术

    3. 消除对大型表行数据的顺序存取:在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。避免这种情况的主要方法就是对连接的列进行索引。 通过以上方法,可以有效地提高查询效率,提高程序性能。同时,也...

    java、MYSQL作业上传系统

    在系统架构上,可能采用了Java的Spring Boot框架,它简化了开发过程,提供了内置的服务器、自动配置以及对各种组件(如数据访问、安全等)的支持。对于前端,可能会使用HTML、CSS和JavaScript,配合诸如Thymeleaf或...

    MySQL数据库在自动测试系统中的应用研究.pdf

    MySQL数据库可以用来存储自动测试过程中产生的大量数据,如测试用例、测试结果等。通过对数据进行有效的分类和组织,可以方便地进行数据分析和检索。 ##### 4.2 数据备份与恢复 为了防止数据丢失,自动测试系统...

    MySql5.5精简免安装版

    此外,InnoDB还支持自适应哈希索引,能够自动创建和维护哈希索引来加速查询。 其次,MySQL 5.5增强了查询优化器。查询优化器是数据库系统的核心组件,负责选择执行SQL查询的最佳策略。此版本中,优化器对JOIN操作...

    mysql-connector-java-8.0.29.zip_数据库

    8. **新特性与改进**: 每个版本都会带来一些新的特性和改进,8.0.29可能包括增强的错误处理、性能提升、新的API功能以及对最新MySQL服务器特性的支持。 9. **配置选项**: 用户可以通过设置JDBC URL、系统属性或连接...

    mysql驱动包jdbc(mysql-connector-java-3.1.14)

    7. **事务管理**:JDBC支持事务的概念,通过`Connection`对象的`setAutoCommit()`方法可以控制自动提交,或者手动调用`commit()`和`rollback()`来控制事务边界。 8. **连接池**:在实际应用中,为了提高性能和资源...

    mysql数据库my.cnf配置文件

    # 这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲 #query_cache_limit = 2M #指定单个查询能够使用的缓冲区大小,默认1M key_...

    mysql驱动包驱动

    它实现了Java Database Connectivity (JDBC) API,使得Java开发者能够通过编写Java代码与MySQL数据库进行交互,执行SQL查询、更新数据、管理事务等操作。在本篇文章中,我们将深入探讨MySQL驱动的原理、使用方法以及...

    MySQL 57 Replication Enhancements

    MySQL 5.7版本在复制功能方面带来了许多增强和改进,极大地提升了数据库的可用性和性能。以下是关于这个主题的一些关键知识点: 1. **GTID(全局事务标识符)**: MySQL 5.7 强化了GTID(Global Transaction ...

    mysql中文帮助文档

    4. **事务处理与并发控制**:MySQL支持ACID(原子性、一致性、隔离性和持久性)特性,文档将介绍事务的概念、提交、回滚以及隔离级别设置,同时会讨论并发控制机制,如锁定和MVCC(多版本并发控制)。 5. **视图与...

    mysql5.5及安装图解

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,带来了许多性能提升和新特性。MySQL是一种广泛使用的开源关系型数据库系统,尤其在Web应用程序中非常流行,因其高效、可靠和易用性而备受赞誉。 在...

    搭建mysql-cluster集群.docx

    MySQL Cluster是适用于分布式计算环境的高可用、高冗余版本的MySQL,其技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。...

    深入理解MySQL Group Replication

    虽然MySQL Group Replication提供了高度可靠的数据复制方案,但在实际部署时也需要考虑其对性能的影响。由于增加了数据一致性和故障恢复的能力,可能会带来一定的网络延迟和额外的计算开销。因此,在设计系统架构时...

Global site tag (gtag.js) - Google Analytics