MySQL学习笔记10—事务

TCL语言——事务控制语言(Transaction Control Language)

仅作为学习笔记,学习资源来源于B站视频:BV1xW411u7ax

1、事务概念

  事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,要么全部执行,要么全部不执行。
  如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。

2、事务的特性-ACID

  • 原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行
  • 一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另外一个一致状态
  • 隔离性(Isolation):一个事务的执行不受其他事务的干扰
  • 持久性(Durability):一个事务一旦提交,则会永久的改变数据库的数据.

3、事务的创建

(1)事务分类

  • 隐式事务:事务没有明显的开启和结束的标记
    比如insert、update、delete语句
  • 显式事务:事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用:set autocommit=0;

(2)创建事务步骤

# 步骤1:开启事务
set autocommit=0;
start transaction; # 可选的
# 步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...
# 步骤3:结束事务-两种选择
commit; #提交事务
rollback; #回滚事务

(3)保存点的设置

SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a; #回滚到保存点

(4)事务对于delete和truncate的处理的区别
  delete可以实现回滚;truncate不能实现回滚。

4、并发问题与隔离级别

4.1 并发问题

  对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:

  • 脏读: 对于两个事务 T1,T2;T1 读取了已经被 T2 更新但还没有被提交的字段之后,若 T2 回滚,T1读取的内容就是临时且无效的。
  • 不可重复读: 对于两个事务T1,T2; T1 读取了一个字段, 然后 T2 更新了该字段之后,T1再次读取同一个字段,值就不同了。
  • 幻读: 对于两个事务T1、T2;T1 从一个表中读取了一个字段, 然后 T2 在该表中 插入了一些新的行之后,如果 T1 再次读取同一个表, 就会多出几行。

4.2 隔离级别

   一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

隔离级别 脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read × ×
serializable × × ×

serializable什么并发问题都可以避免但性能低下
mysql中默认第三个隔离级别:repeatable read
oracle中默认第二个隔离级别:read committed
在服务端中可以查看当前隔离级别以及更改隔离级别

# 查看隔离级别
# mysql 5 版本
select @@tx_isolation;
# mysql 8 版本
select @@transaction_isolation;
# 设置隔离级别
# 只针对当前连接有效
set session transaction isolation level 隔离级别;
# global则是对全部连接有效
set global transaction isolation level 隔离级别;

猜你喜欢

转载自blog.csdn.net/JakeSunJG/article/details/112943662