MySQL事务的学习

一、数据库事务概述

1、事务的概念

一组逻辑操作单元,使数据从一种状态换到另一种状态。

2、事务处理的原则

保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

3、事务的ACID特性

  • 1、原子性(atomicity):原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚,不存在中间状态。

例子:A向B转账100,A账户余额就要-100,B账户余额就要+100,两者要么都成功要么都失败。

  • 2、一致性(consistency):一致性是指事务执行前后,数据从一个合法性状态变换到另一个合法性状态。这种状态是语义上的而不是语法上的,跟具体的业务有关。

例子:A账户有200元,转出去300元,此时A账户还是-100元,这就不合法了,因为定义了账户余额>=0。

  • 3、隔离性(isolation):隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及数据的使用对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

例子:A向B转账50两次。
MySQL事务的学习_第1张图片

  • 4、持久性(durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。

4、事务的状态

活动的:事务正在执行
部分提交的:事务的操作已完成但还未刷新到磁盘
失败的:遇到错误或人为停止执行事务
中止的:碰到失败并回滚到恢复到之前状态
提交的:事务操作都已经同步到磁盘上

二、如何使用事务

事务的完成过程
步骤一:开启事务
步骤二:一系列DML操作

步骤三:结束状态:提交或中止

1、显示事务

开启事务:
方式二:start transaction 
方式一:begin
设置保存点:
savepoint + 保存点名
作用:如果事务执行过程中发现自己写错,可使用rollback to +保存点名,去回滚数据。

2、隐式事务

默认开启,每一条DML语句都相当于一条独立的事务,会自动提交。

关闭隐式事务
set autocommit = false

三、事务类别

1、扁平事务:最普通的事务
2、带有保存点的扁平事务:即使用savepoint
3、链事务:事务里存在触发器用于开启下一个事务
4、嵌套事务:事务里有事务
5、分布式事务:在分布式环境下运行的扁平事务

四、事务的隔离级别

1、数据并发问题

脏写:对于两个事务SessionA和SessionB,SessionA修改了另一个未提交事务SessionB修改过的数据。

MySQL事务的学习_第2张图片

2、脏读:对于两个事务SessionA和SessionB,SessionA读取了SessionB未提交的数据。

MySQL事务的学习_第3张图片

3、不可重复读:对于两个事务SessionA和SessionB,SessionA读取了一个字段,然后SessionB更新了该字段,之后SessionA再读取同一个字段,值就不同了。

MySQL事务的学习_第4张图片

4、幻读:对于两个事务SessionA和SessionB,SessionA从一个表中读了一个字段,然后SessionB在该表中插入了一些新的行。如果SessionA在读同一个表,就会多出几行。(幻读一般强调插入行为,比如多了几条数据,区别于不可重复读。)

MySQL事务的学习_第5张图片

2、SQL中的四种隔离级别

MySQL事务的学习_第6张图片
四种隔离级别都能解决脏写问题
MySQL事务的学习_第7张图片
MySQL事务的学习_第8张图片

3、设置隔离级别

//查看隔离级别mysql5.7版本之后
show variables like 'transaction_ioslation';
//各种mysql版本都能查看的
select @@transaction_ioslation;

设置隔离级别
MySQL事务的学习_第9张图片
global:在全局范围影响。
摘自尚硅谷宋红康老师的课
session:在会话范围影响
MySQL事务的学习_第10张图片

你可能感兴趣的:(MySQL学习,mysql)