认识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,且看且珍惜~

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值