MySQL的事务

什么是事务?

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供
一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台 MySQL 中,
不在需要你的数据,要删除你的所有信息(一般不会:) ), 那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信
息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,
就构成了一个事务。

正如我们上面所说,一个 MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器
发起事务处理请求。而每条事务至少一条 SQL ,最多很多 SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问
题。甚至,因为事务由多条 SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

所以一个完整的事务要满足如下四个特性

  1. 原子性(Atomicity): 事务是原子的,它要么完全执行,要么完全不执行。如果事务中的任何一部分操作失败,整个事务将回滚到初始状态。
  2. 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束保持一致。如果事务执行成功,数据库状态将从一个一致状态转移到另一个一致状态。
  3. 隔离性(Isolation): 事务的执行是相互隔离的,一个事务的执行不应影响其他事务。这意味着即使在同一时刻有多个事务在执行,每个事务也应该感觉自己是在一个独立的环境中进行操作。
  4. 持久性(Durability): 一旦事务成功提交,其对数据库的更改将永久保存,即使在数据库系统崩溃后也能恢复。

事务的基本操作

show variables like 'autocommit'//查看是否是自动提交
set autocommit=0;//设置手动提交
set autocommit=1;//设置自动提交
在MySQL中,你可以使用以下SQL语句来开始、提交或回滚事务:

START TRANSACTION 开始一个事务。或者使用begin;//开始事务
savepoint save1; 创建一个保存点save1
COMMIT 提交事务,将更改永久保存到数据库。
ROLLBACK 回滚事务,取消先前的更改。直接rollback会直接回滚到最事务的开始
rollback to save1;回滚到save保存点

事务操作的基本常识

  • 当使用begin或者START TRANSACTION开始一个事务时,必须commit才能提交事务才能持久化存储,哪怕设置了自动提交。
  • 如果事务一旦提交,不能进行rollback操作,只能提交之前回滚。如果没有设置保存点,直接回滚到begin开始的时候。
  • 当事务开始的时候,由于某种原因异常退出了,事务会自动回滚到begin前的状态。
  • 之前学习的每一条SQL都是被封装成了事务,再加上自动提交默认会设置成开启状态,所以才会执行后立马生效。如果我们关闭自动提交,执行一条SQL必须手动commit才会持久化。
  • MySQL只有innodb 支持事务,其他不支持

事务隔离性和隔离级别

  • 脏读:一个正在执行中的事务读取到了 另一个还未提交事务操作(增删改)的数据。

  • 不可重复读:一个事务正在执行期间,因为能查看到别的事务已经提交的数据,数据发生的变化可能会导致当前事务进行数据处理时会有不符合逻辑的结果,例如重复相同查询结果不同,就有可能影响当前事务的事件处理。

  • 幻读:当隔离级别是可重复读的时候,开启本次事务之后,只能读取到begin之前的数据,但是万一我们begin开始了,还没有commit,别的事务对这个表进行了增加删除操作,我们由于没有commit仍然能读取到被修改的数据,但是我们一旦commit之后,这些数据突然被增加或者删除了,这个叫做幻读。

在MySQL中,事务隔离性(Transaction Isolation)是指多个事务并发执行时,一个事务的执行不应该被其他事务所影响,各个事务之间应该相互隔离。分别有以下几个隔离级别:

  • READ UNCOMMITTED(读取未提交数据):最低的隔离级别。事务可以读取未被其他事务提交的数据,可能会看到脏读、不可重复读和幻读。这种隔离级别基本上没有隔离性,严重不推荐。
  • READ COMMITTED(读取已提交数据):事务只能读取已经被其他事务提交的数据。避免了脏读,但仍可能出现不可重复读和幻读。大多数数据库默认隔离级别(不包括MySQL)
  • REPEATABLE READ(可重复读):确保在同一个事务中的多次读取相同的数据时,结果保持一致。开启本次事务之后,只能读取到以begin时为初始状态和本次事务操作的数据,无论别的事务是否已经提交,只有结束当前事务才能读取到别的事务的操作。避免了脏读和不可重复读,但仍可能出现幻读,这是MySQL默认隔离级别。
  • SERIALIZABLE(可串行化):最高的隔离级别。确保事务之间的完全隔离,包括脏读、不可重复读和幻读。通常使用锁机制来实现,查询不会抢锁,但是其他操作会等先抢到锁的事务提交之后才能执行成功。实际开发中也不会用到这种隔离级别。

事务的隔离级别设置

SELECT @@global.tx_isolation; --查看全局隔级别
SELECT @@session.tx_isolation; --查看会话(当前)全局隔级别
SELECT @@tx_isolation;		--查看会话(当前)全局隔级别

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ
COMMITTED | REPEATABLE READ | SERIALIZABLE}

--设置当前会话隔离性,只会影响当前会话,另起一个会话默认还是拷贝全局隔离级别
例如: set session transaction isolation level serializable; -- 串行化
  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值