MySQL8 事务( Transaction)是访问和更新数据库的程序执行单元,事务可以包含一个或多个 SQL 语句,这些语句要么都执行、要么都不执行。MySQL8 事务控制是由存储引擎实现的,默认存储引擎是 InnoDB。
事务控制可以用来维护数据库数据的完整性,ACID 是衡量事务的四个特性。
合理使用事务控制非常重要,尤其是在一定的并发访问下如何保证数据完整性的问题。
关键字修饰符为:
persist:对当前和后续新的连接生效,重启也不会丢失修改;
global:对新的连接生效,重启丢失;
session:当前连接短期内生效。
存储引擎 InnoDB 的事务隔离级别:
MySQL8 是默认自动将更改永久提交到数据库,可以通过修改参数更改状态。在开启事务自动提交状态下、同时执行多条语句,如果中间遇到异常,前面语句执行成功,后面失败,这样就导致需要完整执行的数据不完整。
# 查看自动提交事务状态 show variables like 'autocommit' # 设置不自动提交事务状态 set autocommit = on;
# 创建测试表 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;
由于不同的代码兼容性问题,可能会造成一个事务等待另外一个事务释放资源的现象,因此需要定期监测和优化。
查看事务阻塞语句示例:
# 阻塞大于 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 事务控制,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 事务控制介绍开始,逐步到 MySQL8 事务示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。