0


认识MySQL---“事务”,以及事务隔离级别问题

什么是MySQL的“事务”

话不多说,先上一张图。

我们看出,老板的转账与阿K的收款之间是属于一个“完整的流程”。如果流程之间有问题,导致失败,那么这样的系统或流程是有问题的。


事务 定义:将一组SQL语句放在同一批次内执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。

也就是:逻辑上的一组操作,要么都执行,要么都不执行

特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库就会回滚到该事务开始之前的状态

事务的限制:MySQL的数据库中仅InnDB类型的数据库表支持事务


事务的执行主要包括两个操作,提交和回滚

提交:commit,将事务执行结果写入数据库

回滚:rollback,回滚所有已经执行的语句,返回修改之前的数据


事务的【ACID】原则

1--- Atomic 原子性

意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行 。

2--- Consist 一致性

即在事务开始之前和 事务结束以后,数据库的完整性约束没有被破坏。

3---Isolated 隔离性

事务的执行是互不干扰的,一个事务不可能看到其他事务运行时中间某 一时刻的数据。

4--Durable 持久性

意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

事务的具体操作

create table schoolmaster(
smid int PRIMARY KEY auto_increment,
sm_name varchar(10) ,
smsex varchar(2),
smmoney DECIMAL(10,1)
);
insert into schoolmaster(sm_name,smsex,smmoney) values('皇世仁','男',3000),('阿K','男',3000);

1、建立一个schoolmaster表,语句如下:

添加数据:

1-关闭自动提交

SET AUTOCOMMIT=0;

2-开始一个事务,标记事务的起始点

START TRANSACTION;

3-执行SQL语句

update schoolmaster set smmoney=smmoney-3000 where sm_name='皇世仁';

update schoolmaster set smmoney=smmoney+3000 where sm_name='阿K';

4- 提交 commit

此时,老板转出了工资3000,阿K收到了工资3000;

SQL语句执行成功,事务成功提交;

5- 这时如果我们把其中一个人的信息输入错误,按以下正常执行sql语句后,这时只有一个人的金额发生了变化。证明事务提交失败了,需要回滚后重新提交。

(发工资前)

执行SQL语句

update schoolmaster set smmoney=smmoney-3000 where sm_name='皇世仁';
update schoolmaster set smmoney=smmoney+3000 where sm_name='阿Q';

**此时银行卡被盗,“阿K”变“阿Q” **

输出结果:

事务提交失败(收不到工资的情况出现)rollback回滚,再次提交。

MySQL实现事务的步骤

事务隔离级别

一、 Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。

二、Read Committed(读取提交内容也叫做不可重复读)

这是大多数数据库系统的默认隔离级别

三、Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

四、Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

事务带来的问题

一、脏读(读取未提交的数据)

二、幻读(幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行)

三、跟新丢失(当两个事务选择同一行,然后更新数据,由于每个事务都不知道其他事务的存在,就会发生丢失更新的问题)

四、不可重复读(在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据)

PS:这个“手写表”is very important,且看且珍惜~

标签: mysql java 数据库

本文转载自: https://blog.csdn.net/m0_67656219/article/details/125351914
版权归原作者 长安代号007 所有, 如有侵权,请联系我们删除。

“认识MySQL---“事务”,以及事务隔离级别问题”的评论:

还没有评论