深入理解MySQL事务特性与自动提交

 更新时间:2024年07月05日 10:00:05   作者:码农老张Zy  
事务以及事务隔离机制,其实是所有关系型数据库都有的问题,本文主要介绍了深入理解MySQL事务特性与自动提交,具有一定的参考价值,感兴趣的可以了解一下

又是比较偏基础理论的一篇文章,不过这也是向 MySQL 更高水平进阶的必经之路。关于事务以及事务隔离机制,其实是所有关系型数据库都有的问题,它是一套比较基础的理论和工具。

事务特性

事务这个东西,想必不用我过多解释大家也都清楚,这也是我们学习任何数据库产品的必学知识。同时,对于事务来说,还有 ACID 四大特性,我们先来复习一下。

  • Atomicity 原子性,事务内的操作,要么全成功,要么全失败,失败了就回滚,成功了就提交

  • Consistency 一致性,从一个一致性状态变换到另一个一致性状态,比如有两个人,帐号里一共有 100 块,不管两人怎么来回转账,最后的总和还是 100 块

  • Isolation 隔离性,多个用户同时操作数据时,一个用户的操作不能被别的用户影响

  • Durability 持久性,事务提交了,那么改变就是永久的

有了这四个特性的保证,我们就可以说事务是非常安全的操作。这个安全体现在什么地方呢?最典型的例子就是转帐问题,A向B转了100块,首先我们扣除A帐户里的钱,这时因为各种原因操作中断了,B的帐户没有收到钱,这时候A少了100,B没有增加,问题也就随之产生了。事务,主要解决的就是这类问题。

事务的自动提交

既然这么好,我们需要给所有操作都使用事务吗?其实默认情况下 MySQL 是开启了自动事务提交的,你的每一个操作语句都会是一个事务。注意,是每一个,而不是多个语句在同一个事务中。

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+

这个 autocommit 代表的就是自动提交事务,我们可以关闭它,如果关闭它的话,则每条语句后面我们都需要 commit 一下。现在我们开两个命令行窗口,在第一个命令行窗口设置 autocommit 为 OFF 。

mysql> set session autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+

接着,修改一条数据。

mysql> update test_user set username='bbb' where id = 2200000;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后我们在另一个命令行窗口查看数据,数据依然是原来的状态,用户名没有更改为 bbb 。这个时候,我们回到第一个命令行窗口,运行 commit 提交事务。此时,再回到另一个窗口查询,就可以看到修改之后的数据了。

-- 客户端2
mysql> select * from test_user where id = 2200000;
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+
| id      | username             | password                                 | salt | created_at          | updated_at | status | gender |
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+
| 2200000 | ebbf4060e7aa5d1099b8 | 741a7199e189eebba674736397fa49d727c11348 | 2067 | 2022-01-19 23:58:59 | 1630877171 |      4 |      1 |
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+

-- 客户端1
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

-- 客户端2
mysql> select * from test_user where id = 2200000;
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+
| id      | username             | password                                 | salt | created_at          | updated_at | status | gender |
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+
| 2200000 | bbb | 741a7199e189eebba674736397fa49d727c11348 | 2067 | 2022-01-19 23:58:59 | 1630877171 |      4 |      1 |
+---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+

好吧,正常情况下我们其实还是保持自动提交比较好,真正需要事务的时候,直接 BEGIN 开启,然后根据情况使用 COMMIT 或 ROLLBACK 就好了。

总结

今天的内容我们就是简单地回顾一下基础,同时再演示了一下关闭 MySQL 中的事务自动提交的效果。相信大家并不过瘾,为啥呢?鼎鼎大名的事务隔离机制没讲呀,别急,这个我们放到后面再说,下一回,我们先说说事务中可能出现的问题,也是非常出名的三个问题,那就是:脏读、幻读、不可重复读的问题。

到此这篇关于深入理解MySQL事务特性与自动提交的文章就介绍到这了,更多相关MySQL事务特性与自动提交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • mysqldump加-w参数备份数据时需要注意的事项

    mysqldump加-w参数备份数据时需要注意的事项

    这篇文章主要介绍了mysqldump加-w参数备份数据时需要注意的事项,需要的朋友可以参考下
    2014-06-06
  • MySQL定时任务(EVENT事件)如何配置详解

    MySQL定时任务(EVENT事件)如何配置详解

    这篇文章主要介绍了MySQL定时任务(EVENT事件)如何配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL快速分页查询的优化方案

    MySQL快速分页查询的优化方案

    本文主要介绍了传统分页方法的性能瓶颈,并详细阐述了五种优化方案:基于游标的分页、覆盖索引优化、子查询优化、延迟关联和预计算分页数据,通过性能对比,展示了不同方法在不同场景下的适用性,并指出了使用这些优化方案时需要注意的事项,需要的朋友可以参考下
    2026-03-03
  • Linux下修改MySQL数据库数据文件路径的步骤

    Linux下修改MySQL数据库数据文件路径的步骤

    这篇文章主要介绍了Linux下修改MySQL数据库数据文件路径的步骤,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • MySQL清空数据表的方法实例与分析

    MySQL清空数据表的方法实例与分析

    这篇文章给大家详细介绍了MySQL清空数据表的方法,文中给出了实例代码,对大家学习使用MySQL具有一定的参考借鉴价值,有需要的可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 浅析MySQL如何实现事务隔离

    浅析MySQL如何实现事务隔离

    使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),今天我们主要来理解一下事务的隔离性
    2021-06-06
  • MySQL中SHOW DATABASES语句查看或显示数据库

    MySQL中SHOW DATABASES语句查看或显示数据库

    在MySQL中,可使用SHOW DATABASES语句来查看或显示当前用户权限范围以内的数据库,下面就来介绍一下如何使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • MySQL INT类型全解析

    MySQL INT类型全解析

    这篇文章主要介绍了MySQL INT类型的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL中的存储过程异常处理

    MySQL中的存储过程异常处理

    这篇文章主要介绍了MySQL中的存储过程异常处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • mysql中的int类型对应于java中的Long类型详解

    mysql中的int类型对应于java中的Long类型详解

    这篇文章主要介绍了mysql中的int类型对应于java中的Long类型,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论