mysql笔记1:事务以及并发带来的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010452388/article/details/84928777

目录

一 什么是事务?

1.1 定义

1.2 mysql中如何开启事务

1.3 事务典型场景(转账)

二 事务的ACID特性

三 事务并发带来的问题

3.1 脏读

3.2 不可重复读

3.3 幻读

四 事务的隔离级别

五 innodb引擎对隔离级别的支持程度


一 什么是事务?

1.1 定义

操作数据库的最小工作单元,是一系列操作的逻辑的一个组合,是一组不可再分割的操作的集合

1.2 mysql中如何开启事务

  • set session autocommit = on/off;      设定事务是否自动开启

设置为on的时候,默认开启,设置为off的时候为手动事务,那么我们下面看看如何手工开启

  • begin / start transaction    手工

  • commit / rollback              事务提交或回滚

我们可以通过show variables like 'autocommit'; 查看事务开启的状态

 

1.3 事务典型场景(转账)

最经典的就是转账,例如下面这个从userID=3用户转给userID=1用户 1000块钱

update user_account set balance = balance - 1000 where userID = 3;
update user_account set balance = balance + 1000 where userID = 1;

 上面这个情况,如果在mysql里执行的话,其实是两个事务,底层其实是下面这样执行的

--开启事务
BEGIN/START TRANSACTION;
update user_account set balance = balance - 1000 where userID = 3;
--提交
COMMIT;

--开启事务
BEGIN/START TRANSACTION;
update user_account set balance = balance + 1000 where userID = 1;
--提交
COMMIT;

 

二 事务的ACID特性

原子性(Atomicity)

一个事务事务的操作要么全部成功,要么全部失败

一致性(Consistency)

事务开始之前和结束之后,数据库的完整性没有被破坏,写入的资料完全符合所有的预设的规则

这里一致性可能比较难理解,比方说:A转账给B用户100元,但是A只有90元,转完之后A就是-10元了,站在数据结构层是没有问题的,但是在应用层,这个就不符合预设的规则(我们要保证用户的钱>=0)

隔离性(Isolation)

数据库允许并发的事务同时对数据库读写和修改的能力,可以防止多个事务并发执行时导致数据不一致性

持久性(Durability)

事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失

 

三 事务并发带来的问题

3.1 脏读

1.事务B更新年龄18

2.事务A读取数据库信息,年龄是18

3.事务B回滚

那么这个就是脏读

3.2 不可重复读

1.事务A先读取数据,年龄为16

2.事务B跟新数据,年龄为18

3.事务B提交

4.事务A再读取数据,年龄为18

事务A连续读取两次的数据都不一样,为不可重复读

3.3 幻读

1.事务A读取年龄大于15的数据,发现有1条记录

2.事务B插入一条记录,并提交

3.事务A再读取年龄大于15的数据,发现有2条记录

事务A就好像出现了幻觉一样,一般幻读出现在范围查询

解决上面的3个问题,就要通过事务的隔离性来解决了,那么就要了解下事务的隔离级别

四 事务的隔离级别

  • Read Uncommitted(未提交读) --未解决并发问题

事务未提交对其他事务也是可见的,脏读(dirty read)

  • Read Committed(提交读)        --解决脏读问题

一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(nonrepeatable
read)

  • Repeatable Read (可重复读)       --解决不可重复读问题

在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题

  • Serializable(串行化)                --解决所有问题

最高的隔离级别,通过强制事务的串行执行

五 innodb引擎对隔离级别的支持程度

对于可重复读级别,脏读,不可重复读,幻读在innodb引擎不会出现

那隔离级别是如何实现的呢?请看下一篇的innodb锁的分析

展开阅读全文

没有更多推荐了,返回首页