梳理 mysql 事务

导读:本篇文章讲解 梳理 mysql 事务,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言:

mysql 是程序员数据库基础,事务是 mysql 的高级特性,一般刚接触 mysql 用不上,在经历过各种表联合操作的痛苦后就会逐步顺从。
自认为比较懂 mysql 的事务,不外乎 ACID,mysql 怎么开展事务,java 里面怎么使用,可是某天被人问了一下,突然有点不知所措,觉得还是有必要总结一下。

1.什么是事务

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

2.mysql 事务表现

在关系数据库中,一个事务可以是一条SQL语句或一组SQL语句,要么全部执行,要么执行出错回滚(全部不执行)。

3.事务属性(又称特性)

四个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。

  1. 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  2. 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  3. 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  4. 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
4.隔离性级别

讲隔离级别前,需要说一下如果隔离不当可能出现的事务问题。

  1. 脏读。指当一个事务正在访问数据,并且对数据进行了修改,但这种修改没有提交到数据库中,此时,另外一个事务可以访问到这个被修改的数据。
  2. 不可重复读。指在一个事务内,多次读同一数据,在这个事务还没有结束时,另外一个事务访问并修改提交该数据,那么,在第一个事务中两次读取的数据就可能不一样。
  3. 幻读。在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。

四个级别:读未提交、读已提交、可重复读、串行化。
1. 读未提交(read uncommitted)。事务 A 和事务 B 同步开展,事务 A 未提交的数据,事务B可以读取(脏读现象)。
2. 读已提交(read committed)。事务 A 和事务 B 同步开展,事物A提交后的数据,事物B才能读取(避免脏读现象)。
3. 可重复读(repeatable read)。事务 A 和事务 B 同步开展,事务A提交之后的数据,事务B读取不到(mysql 默认隔离级别,另:只有 InnoDB 引擎才支持事务)。
4. 串行化(serializable)。事务A和事务B同步开展,事务A在操作数据库时,事务B只能排队等待(绝对安全,效率贼低)。

5. mysql 事务样例

mysql 事务以关键字 begin 标志
mysql 事务提交(结束)以关键字 commit 标志
mysql 事务回滚(结束)以关键字 rollback 标志

建表:

CREATE TABLE `tb_test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

原始数据

select * from tb_test;

id	|	name
1	|	jack

模拟事务开始-提交

begin;
insert into tb_test(name) value('tonny');
commit;
======================
select * from tb_test;

id	|	name
1	|	jack
2	|	tonny

模拟事务开始-回滚

begin;
insert into tb_test(name) value('jerry');
rollback;
======================
select * from tb_test;

id	|	name
1	|	jack
2	|	tonny
6.其它
  1. 查看 mysql 隔离级别:
show variables like 'tx_isolation';	# mysql 8 以前
show variables like 'transaction_isolation';	# mysql 8
  1. spring 中可以通过注解 @Transactional 开展事务

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16538.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!