MySQL学习笔记进阶篇(九)之事务

本文深入解析MySQL事务的概念,包括原子性、一致性、隔离性和持久性等四大特性,以及如何在实际操作中开启、提交和回滚事务。同时,文章还探讨了事务的并发问题,如脏读、不可重复读和幻读,并介绍了不同隔离级别的设置和影响。

事务在我们做较为复杂的项目时都会用到,无论用什么数据库都会用到事务处理。MySQL 事务主要用于处理操作量大,复杂度高的数据。

事务的一些介绍:

事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
   - 支持连续SQL的集体成功或集体撤销。
   - 事务是数据库的一个功能。
   - MySQL需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
   - InnoDB被称为事务安全型引擎。

事务的特性:

 1. 原子性(Atomicity)
       事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
   2. 一致性(Consistency)
       事务前后数据的完整性必须保持一致。
       - 事务开始和结束时,外部数据一致
       - 在整个事务过程中,操作是连续的
   3. 隔离性(Isolation)
       多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
   4. 持久性(Durability)
       一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

MySQL中事务的注意事项:

   1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
   2. 事务不能被嵌套。

MySQL事务的执行要求:

   1. 要求是事务支持的表类型
   2. 执行一组相关的操作前要开启事务
   3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。

事务开启

START TRANSACTION; 或者 BEGIN;
   开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。

事务提交

COMMIT;

事务回滚

   ROLLBACK;

演示执行事务

--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--提交事务
commit;

演示事务回滚

--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--回滚事务
rollback;

由于事务回滚了,所以在开启事务之后执行的语句都相当于撤回了,所以演示的时候查询回滚的数据会出错。

当然我们还可以设置一个事务回滚的标记点。

保存点

SAVEPOINT 保存点名称 -- 设置一个事务保存点
   ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
   RELEASE SAVEPOINT 保存点名称 -- 删除保存点

我们还可以设置自动提交事务。

InnoDB自动提交特性设置

   SET autocommit = 0|1;   0表示关闭自动提交,1表示开启自动提交。
   - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
   - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
     SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
     而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)

 事务的并发

事务的并发问题涉及以下几种情况

1.脏读

      能够看到其他用户还没有提交的数据

2.不可重复度

      两个用户发出相同的查询,却返回了不同的数据

3.幻读

事务的隔离级别

隔离级别脏读不可重复度幻读说明
read-uncommitted一个事务可以读取另一个未提交事务的数据
read-committed×一个事务要等待另一个事务提交后才能读取数据
repeatable-read××当开启读取数据时(事务已开启),不允许修改数据
serializable×××

事务串行化执行,都可避免,但性能最低。不建议使用。

查看隔离级别

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)

设置隔离级别

set global transaction isolation level 隔离级别

set session transaction isolation level 隔离级别

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值