首页 > 数据库 >MySQL 中的事务控制机制

MySQL 中的事务控制机制

时间:2023-01-16 17:25:25浏览次数:45  
标签:autocommit 事务 transaction isolation REPEATABLE MySQL 机制

事务控制是 MySQL 的重要特性之一。在 MySQL 中,InnoDB 和 NDB Cluster 是常见的事务型存储引擎。

1. 自动提交
默认情况下,MySQL 是自动提交(autocommit)的。也就意味着:如果不是显式地开始一个事务,每个查询都会被当做一个事务执行 commit。这是和 Oracle 的事务管理明显不同的地方,如果应用是从Oracle 数据库迁移至 MySQL 数据库,则需要确保应用中是否对事务进行了明确的管理。

在当前连接中,可以通过设置 autocommit 来修改自动提交模式:

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set autocommit = 1;
Query OK, 0 rows affected (0.00 sec)
-- 1或ON表示启用自动提交模式,0或OFF表示禁用自动提交模式
如果设置了autocommit=0,当前连接所有事务都需要通过明确的命令来提交或回滚。

对于 MyISAM 这种非事务型的表,修改 autocommit 不会有任何影响,因为非事务型的表,没有 commit或 rollback 的概念,它会一直处于 autocommit 启用的状态。

有些命令,在执行之前会强制执行 commit 提交当前连接的事务。比如 DDL 中的 alter table,以及lock tables 等语句。

2. 隔离级别调整
默认情况下,MySQL 的隔离级别是可重复读(repeatable read)。MySQL 可以通过 set transaction_isolation 命令来调整隔离级别,新的隔离级别会在下一个事务开始时生效。

调整隔离级别的方法有两种:

临时:在 MySQL 中直接用命令行执行:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

mysql> SET transaction_isolation = 'REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)
永久:将以下两个参数添加至配置文件 my.cnf,并重启 MySQL:

transaction_isolation = 'REPEATABLE-READ'
临时:在 MySQL 中直接用命令行执行:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

mysql> SET transaction_isolation = 'REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)
永久:将以下两个参数添加至配置文件 my.cnf,并重启 MySQL:

transaction_isolation = 'REPEATABLE-READ'
3. 事务中使用不同的存储引擎
MySQL 的服务层并不负责事务的处理,事务都是由存储引擎层实现。

在同一事务中,使用多种存储引擎是不可靠的,尤其在事务中混合使用了事务型和非事务型的表。如同一事务中,使用了 InnoDB 和 MyISAM 表:

如果事务正常提交,不会有什么问题;
如果事务遇到异常需要回滚,非事务型的表就无法撤销表更,这就会直接导致数据处于不一致的状态。
4. 小结
本小节主要介绍了 MySQL 中事务控制的一些特点,如何调整自动提交(autocommit)、如何调整隔离级别调整、以及讲解了在事务中使用混合存储引擎的缺点。

标签:autocommit,事务,transaction,isolation,REPEATABLE,MySQL,机制
From: https://www.cnblogs.com/10zhan/p/17055926.html

相关文章

  • mac虚拟环境Reason: tried: '/usr/local/lib/libmysqlclient.21.dylib' (no such file
    关于django链接数据库时,出现了找不到lib/libmysqlclient.21.dylib的问题。在网上百度了好久,终于用如下的命令解决了。版本信息虚拟环境python=3.7MYSQL=8.0.31mysqlc......
  • MySQL中的事务
    事务简介事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如:......
  • mysql主从同步失败 错误码1594
    起因某日mysql主从同步发生了错误,此时发现从库不再执行同步操作,于是在从库执行showslavestatus\G发现如下错误:上图中标红色的需要重点关注。解决办法之前出现其他常......
  • SQL Server查找未提交事务
    USEmasterGOSETTRANSACTIONISOLATIONLEVELREADUNCOMMITTEDSELECTes.session_id,es.login_name,es.host_name,est.text,cn.last_read,cn.last_write,es.pr......
  • mysql8.0.30主从配置
    安装包下载地址:https://downloads.mysql.com/archives/community/1、解压介质包:#tarxfmysql-8.0.30-linux-glibc2.12-x86_64.tar.xz#mvmysql-8.0.30-linux-glib......
  • MySQL自定义排序ORDER BY FIELD
    在一些场景中,有场景A查询出一个已经排好顺序的id,需要到场景B中查询这些,使用mysql中的WHERE**IN(****),查询出来的结果并不是按照传入的list排序的.但是......
  • MySQL必知必会第十章-创建计算字段
    创建计算字段计算字段计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据库列一......
  • MySQL优化四,高性能优化
    一,查询优化器这个部分的整个过程是由MySQL的存储引擎来做的,优化器就会根据存储引擎来使用原来的开销,优化后的开销,哪个更好一点? 1.如果是查询语句(select语句),首先会查......
  • Java动态代理机制
    概念代理模式是Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等......
  • MySQL必知必会第九章-用正则表达式进行搜索
    用正则表达式进行搜索正则表达式介绍正则表达式是用来匹配文本的特殊的串(字符集合)。使用MySQL正则表达式MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则......