【MySQL】MySQL的事务

事务

1.1 为什么使用事务?

准备测试表:

drop table if exists accout;
create table accout(
 id int primary key auto_increment,
 name varchar(20) comment '账户名称',
 money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('妈妈', 500),
('你', 500);

比如说,妈妈给你的账户转账500元:

 --妈妈账户减少500
update accout set money=money-500 where name = '妈妈';
-- 四十大盗账户增加2000
update accout set money=money+500 where name = '你';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,妈妈的账户会减少500,但是
你的的账户上就没有了增加的金额

解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

1.2 事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

1.3 使用

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;
    说明:rollback即是全部失败,commit即是全部成功。
start transaction;
-- 妈妈账户减少500
update accout set money=money-500 where name = '妈妈';
-- 四十大盗账户增加2000
update accout set money=money+500 where name = '你';
commit;

2.事务的基本特性

  1. 原子性:要么全部执行完,要么一个都不执行,任务不可以再被细分了
  2. 一致性:在事务执行之前,和执行之后,数据库中的数据都得是合理合法的
    例如,你转账完了之后,不能够出现这种账户为负数的情况
  3. 持久性:事务一旦提交了之后,数据就持久化存储起来了 数据就写入到硬盘了
  4. 隔离性:隔离性描述的是,事务并发执行时候,产生的情况
    当并发执行多个事务,尤其是这多个事务在尝试修改/读取同一份数据,这个时候就容易出现一些问题,事务的隔离性,就是在解决上述问题~~

关于隔离性问题,可以引入以下几个概念:

2.1 脏读问题:

事务A在对某个数据进行修改.修改的同时,事务B去读取了这个数据,此时事务B读到的很可能是一个"脏数据"(这个数据是一个临时的结果,而不是最终的结果)

出现脏读的问题,原因就是事务和事务之间,没有进行任何的隔离,加上了一些约束限制,就可以有效的避免脏读问题 。

处理脏读问题:
处理脏读:给写操作加锁:在修改的过程中,别人不能读了.(加锁的状态)等修改完了之后,别人才能读. (解除加锁)

一旦加了这个写锁之后,意味着事务之间的隔离性就高了,并发性就降低了

2.2 不可重复读:

在一个事务中,包含了多次的读操作,这多次的读操作读出来的结果不一致。
刚才约定的是,写的过程中不能读,没说读的过程中不能写,这就产生了不可重复读问题

通过给读操作也加锁,这就解决了不可重复读的问题,意味着事务之间的并发性又降低了,隔离性又提高了。

并发性和隔离性二者是对立的,不可得兼的

2.3 幻读问题:

一个事务执行过程中进行多次查询,多次查询的结果集不一样(多了一条或者少了一条)
这个操作算是一种特殊的不可重复读 !

  • 解决幻读问题:彻底串行化执行
    也就是在读的操作过程中,严格遵守不写入操作。
    此时 :隔离性最高,并发程度最低.数据最可靠,速度最慢

此时我们就可以根据实际需要来调整数据库的隔离级别,通过不同的隔离级别,也就控制了事务之间的隔离性,也就控制了并发程度。

2.4 MySQL中事务的隔离级别

  1. .read uncommitted:允许读取未提交的数据.并发程度最高,隔离程度最低.会引入脏读+不可重复读+幻读问题
  2. read committed:只允许读取提交之后的数据.相当于写加锁.并发程度降低了一些,隔离程度提高了一些.解决了脏读,会引入不可重复读+幻读.
  3. repeatable read:相当于给读和写都加锁.并发程度又降低了.隔离程度又提高了.解决了脏读和不可重复度,会引入幻读.
  4. serializable :串行化.并发程度最低(串行执行)隔离程度最高.解决了脏读,不可重复度,幻读问题,但是执行速度最慢。

我们可以通过修改my.ini这个配置文件,来设置当前的隔离级别,根据实际需求场景,再来决定使用哪种隔离级别!

  • over~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值