默认情况下, MySQL启用自动提交模式(变量autocommit为ON)。这意味着, 只要你执行DML操作的语句,MySQL会立即隐式提交事务(Implicit Commit)。这个跟SQL Server基本是类似的。如果你了解SQL Server数据库的话。

查看autocommit模式

 

由于变量autocommit分会话系统变量与全局系统变量,所以查询的时候,最好区别是会话系统变量还是全局系统变量。

mysql> show session variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> 

Value的值为ON,表示autocommit开启。OFF表示autocommit关闭。

修改autocommit模式

mysql> set session autocommit=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show session variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> 

 

mysql> set global autocommit=0;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show global variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | OFF   |

+---------------+-------+

1 row in set (0.01 sec)

 

mysql> 

注意,上述SQL修改会话系统变量或全局系统变量,只对当前实例有效,如果MySQL服务重启的话,这些设置就会丢失,如果要永久生效,就必须在配置文件中修改系统变量。

[mysqld]

autocommit=0

不过网上还有种方式,如下所示,我在MySQL 5.6/5.7下测试,发现不生效,查了一下,这种方式似乎从MySQL 5.6开始已经不生效了,必须用autocommit=0这种方式替换。

[mysqld]

init_connect='SET autocommit=0'

 

autocommit与显性事务的关系

 

对于显性事务start transaction或begin, 在自动提交模式关闭(关闭隐式提交)的情况下,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。如有不明,可以用下面小实验理解一下:

测试如下所示:

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               1 |

+-----------------+

1 row in set (0.00 sec)

mysql> show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit    | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from MyDB.test where name='kerry';

Query OK, 1 row affected (0.00 sec)

此时在会话2中查看,此时可以查询到会话ID为1的事务信息, 如下所示

mysql>  select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               2 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> SELECT a.trx_state, 

    ->        b.event_name, 

    ->        a.trx_started, 

    ->        b.timer_wait / 1000000000000 timer_wait, 

    ->        a.trx_mysql_thread_id        blocking_trx_id, 

    ->        b.sql_text 

    -> FROM   information_schema.innodb_trx a, 

    ->        performance_schema.events_statements_current b, 

    ->        performance_schema.threads c 

    -> WHERE  a.trx_mysql_thread_id = c.processlist_id 

    ->        AND b.thread_id = c.thread_id; 

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

| trx_state | event_name           | trx_started         | timer_wait | blocking_trx_id | sql_text                                 |

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

| RUNNING   | statement/sql/delete | 2018-03-23 14:55:00 |     0.0010 |               1 | delete from MyDB.test where name='kerry' |

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

1 row in set (0.00 sec)

如果在会话1当中开启显性事务,那么之前挂起的事务会自动提交,然后,你再去会话2当中查询,就发现之前的DELETE操作已经提交。

mysql>  select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               2 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> SELECT a.trx_state, 

    ->        b.event_name, 

    ->        a.trx_started, 

    ->        b.timer_wait / 1000000000000 timer_wait, 

    ->        a.trx_mysql_thread_id        blocking_trx_id, 

    ->        b.sql_text 

    -> FROM   information_schema.innodb_trx a, 

    ->        performance_schema.events_statements_current b, 

    ->        performance_schema.threads c 

    -> WHERE  a.trx_mysql_thread_id = c.processlist_id 

    ->        AND b.thread_id = c.thread_id; 

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

| trx_state | event_name           | trx_started         | timer_wait | blocking_trx_id | sql_text                                 |

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

| RUNNING   | statement/sql/delete | 2018-03-23 14:55:00 |     0.0010 |               1 | delete from MyDB.test where name='kerry' |

+-----------+----------------------+---------------------+------------+-----------------+------------------------------------------+

1 row in set (0.00 sec)

 

mysql> SELECT a.trx_state, 

    ->        b.event_name, 

    ->        a.trx_started, 

    ->        b.timer_wait / 1000000000000 timer_wait, 

    ->        a.trx_mysql_thread_id        blocking_trx_id, 

    ->        b.sql_text 

    -> FROM   information_schema.innodb_trx a, 

    ->        performance_schema.events_statements_current b, 

    ->        performance_schema.threads c 

    -> WHERE  a.trx_mysql_thread_id = c.processlist_id 

    ->        AND b.thread_id = c.thread_id; 

Empty set (0.00 sec)

With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state

使用START TRANSACTION,自动提交将保持禁用状态,直到你使用COMMIT或ROLLBACK结束事务。 自动提交模式然后恢复到之前的状态(如果start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1。如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0)

参考资料:

https://dev.mysql.com/doc/refman/5.7/en/commit.html

MySQL的自动提交模式的更多相关文章

  1. mysql 禁止自动提交设置

    mysql禁止自动提交的设置, 在my.ini文件里加上如下的一句便可 init_connect='SET autocommit=0' 但是有个问题,对root用户进行autocommit变量的查询, ...

  2. 27、myslq更改为不自动提交

    27.1.说明: 默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句, MySQL会立即隐式提交事务(Implicit Commit). ...

  3. Mybatis的JDBC提交设置/关闭mysql自动提交------关于mysql自动提交引发的惨剧

    学习Mybatis时提到了JDBC方式需要自己手动提交事务,如果不加session.commit会导致数据库的数据无法正常插入(程序本身又不给你报错,还装出一副我已经插入成功的样子) SqlSessi ...

  4. 14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚

    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚 如果自动提交模式被启用,在InnoDB里, 所有的用户活动发生在一个事务里, 每个SQL语句 ...

  5. PHP PDO 事务与自动提交

    现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的. 事务支持四大特性(ACID): 原子性(Atomicity) 一致性(Consistency) 隔离性(Isola ...

  6. 事务_基本演示和事务_默认自动提交&手动提交

    事务的基本介绍 概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作: 开启事务:start transaction; 回滚:rollback; 提交:co ...

  7. F12调试模式下使用console自动提交

    F12调试模式下使用console自动提交(F12 的console->输入代码->按enter即可运行) 1.使用定时器setInterval进行自动提交 //方法中可使用jquery调 ...

  8. MysqL自动提交机制的关闭

    MysqL在执行一句数据库操作命令的时候,通常都是自动提交的.常用引擎下有两种,分别是MyIsam和InnoDB,MyIsam是不支持事务处理的,但InnoDB支持,但InnoDB在不开启事务处理的情 ...

  9. mysql 数据库 自动截取数据的问题---mysql的sql_model的四种模式:宽松模式、严格模式

    mysql支持的sql_mode模式:ANSI.TRADITIONAL.STRICT_ALL_TABLES和STRICT_TRANS_TABLES. ANSI模式:宽松模式,对插入数据进行校验,如果不 ...

随机推荐

  1. [Swift]LeetCode402. 移掉K位数字 | Remove K Digits

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  2. [Swift]LeetCode885. 螺旋矩阵 III | Spiral Matrix III

    On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...

  3. 你还在 Select * 吗?

    应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...

  4. CentOS6.5中部署java web环境

    原来在linux中部署java web环境,没有做好总结,这次在部署的过程中,将部署的过程做了记录,希望对大家有帮助.主要内容包括CentOS安装以后的网络设置,系统自带jdk的卸载,新版本jdk的安 ...

  5. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  6. Android--Tween补间动画

    前言 Android除了支持逐帧动画之外,也提供了对补间动画的支持,补间动画就是指开发人员只需要指定动画的开始.动画结束的"关键帧",而动画变化的"中间帧"由系 ...

  7. mybatis中resultMap配置细则

    resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...

  8. 深入解读阿里云数据库POLARDB核心功能物理复制技术

    日志是数据库的重要组成部份,按顺序以增量的方式记录了数据库上所有的操作,日志模块的设计对于数据库的可靠性.稳定性和性能都非常重要. 可靠性方面,在有一个数据文件的基础全量备份后,对运行中的数据库来说, ...

  9. css加载会造成阻塞吗

    本文由云+社区发表 作者:嘿嘿嘿 可能大家都知道,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?接下来,我就来对css加载对DOM树的解析和渲染的影响做一个测试. 为 ...

  10. 打造自己的.NET Core项目模板

    前言 每个人都有自己习惯的项目结构,有人的喜欢在项目里面建解决方案文件夹:有的人喜欢传统的三层命名:有的人喜欢单一,简单的项目一个csproj就搞定.. 反正就是萝卜青菜,各有所爱. 可能不同的公司对 ...