试试吧

全部免费,试试吧致力于打造领先的一站式在线工具平台!

加载中...

MySQL8 事务控制

MySQL8 事务控制,MySQL8教程,介绍 MySQL8 事务和事务控制等。

全栈教程https://try8.cn/article

教程目录:
教程内容:
最近更新:2023-04-17

一、MySQL8 事务控制介绍

MySQL8 事务( Transaction)是访问和更新数据库的程序执行单元,事务可以包含一个或多个 SQL 语句,这些语句要么都执行、要么都不执行。MySQL8 事务控制是由存储引擎实现的,默认存储引擎是 InnoDB。


1.1、事务控制特性

事务控制可以用来维护数据库数据的完整性,ACID 是衡量事务的四个特性。

  • 原子性:事务必须不可分割,要么全部执行、要么全部不执行;
  • 一致性:在事务开始前后,数据库完整性不能被破坏;
  • 隔离性:并发执行的事务之间不能互相干扰;
  • 持久性:事务一旦提交,对数据的改变就是永久性的。


1.2、事务并发问题

合理使用事务控制非常重要,尤其是在一定的并发访问下如何保证数据完整性的问题。

  • 脏读:一个事务读取了另一个事务未提交的数据;
  • 不可重复读:一个事务内部前后读取同一条数据不一致;
  • 幻读:一个事务两次查询的结果集不一致。


1.3、事务隔离级别

关键字修饰符为:

persist:对当前和后续新的连接生效,重启也不会丢失修改;

global:对新的连接生效,重启丢失;

session:当前连接短期内生效。


存储引擎 InnoDB 的事务隔离级别:

  • READ UNCOMMITTED:读未提交,可能脏读、可能不可重复读、可能不幻读,隔离性最低,并发度最高;
  • READ COMMITTED:读已提交,不可能脏读、可能不可重复读、可能幻读,隔离性一般,并发度一般;
  • REPEATABLE READ:可重复读,不可能脏读、不可能不可重复读、可能不幻读,隔离性一般,并发度一般;
  • SERIALIZABLE:顺序读,不可能脏读、不可能重复读、不可能幻读,隔离性最高,并发度最低。


二、MySQL8 事务控制教程

2.1、自动提交事务

MySQL8 是默认自动将更改永久提交到数据库,可以通过修改参数更改状态。在开启事务自动提交状态下、同时执行多条语句,如果中间遇到异常,前面语句执行成功,后面失败,这样就导致需要完整执行的数据不完整。

# 查看自动提交事务状态
show variables like 'autocommit'
# 设置不自动提交事务状态
set autocommit = on;


2.2、提交事务示例

# 创建测试表
create table if not exists `try8_dev` (
    `try8_id` int not null auto_increment,
    `try8_name` varchar(200) default null, primary key (`try8_id`)
);
# 设置隔离级别
set session transaction isolation level serializable;
# 1、开始启动一个事务,或使用关键字:begin 
start transaction;
# 2、开始编写第一个语句
insert into `try8_dev` (try8_id, try8_name) values (1, '已插入一条数据');
# 3、开始编写第二个语句
update `try8_dev` set try8_name = '已更新一条数据' where try8_id = 1;
# 4、判断条件是否回滚,不选则自动处理
rollback;
# 5、提交
commit;


三、MySQL8 事务阻塞处理

由于不同的代码兼容性问题,可能会造成一个事务等待另外一个事务释放资源的现象,因此需要定期监测和优化。


查看事务阻塞语句示例:

# 阻塞大于 10 秒的会被查询出来
select waiting_pid          as '被阻塞的线程',
    waiting_query           as '被阻塞的SQL',
    blocking_pid            as '阻塞的线程',
    blocking_query          as '阻塞的SQL',
    wait_age                as '阻塞时间',
    sql_kill_blocking_query as '建议'
from sys.innodb_lock_waits
where (unix_timestamp() - unix_timestamp(wait_started)) > 10


将阻塞的线程 ID 手动杀掉:

kill xxx_id;


小提示:事务阻塞的正确做法是优化该 SQL语句,像示例中仅杀掉占用资源的事务,只是临时方案、治标不治本。


四、MySQL8 事务控制 总结

MySQL8教程 - MySQL8 事务控制,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 事务控制介绍开始,逐步到 MySQL8 事务示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。