什么是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,且看且珍惜~
版权归原作者 长安代号007 所有, 如有侵权,请联系我们删除。