MySQL中事务的相关知识梳理

目录

事务的定义

事务的ACID属性

事务的分类

隐式事务

显式事务

事务的隔离级别

为什么会出现隔离级别?

事务的并发问题以及具体体现

补充:

MySQL数据库的隔离级别 

设置隔离级别

查看隔离级别


事务的定义

        事务是由单独单元的,一个或一组sql语句组成一个执行单元【这个执行单元要么全部执行/

要么全部不执行】,整个单独单元时一个不可分割的整体,如果单元种某条sql语句一旦执行失败

或产生错误,整个单元将回滚【返回事务开始前的状态】。

事务的ACID属性

A:Atomicity(原子性):

事务是一个不可分割的工作单位,事务的操作要么都发生/要么都不发生

C:Consistency(一致性):

事务必须使数据库从一个一致性状态,变换到另一个一致性状态

I:Isolation(隔离性)

一个事务的执行不能被其他事务干扰,即一个事务内部的操作即使用的数据对并发的其它事务时

隔离的,并发执行的哥哥事务之间不能互相干扰

D:durablility(持久性)

一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不

应对其有任何影响

事务的分类

隐式事务

没有明显的开启和结束事务的标志

例如:insert、update、delete语句本身就是一个事务

显式事务

具有明显的开启和结束事务的标志

显示事务实现步骤如下:

1. 取消自动提交事务:set autocommit=0;

2. 开启事务:start transaction;

3. 提交- commit / 回滚- rollback 事务

4. 补充:关于删除操作的回滚(delete 支持 / truncate 不支持)

 示例:

#1.设置不自动提交事务
set autocommit=0;

#2.开启事务:
start transaction;

#3.输入要执行的语句
语句1;
语句2;.....

#4.执行事务操作
commit/rollback;

事务的隔离级别

为什么会出现隔离级别?

说到隔离,就会像到事务四大属性中的隔离性,对于多个事务运行时,如果事务访问的是相同的数

据,如果没有设置隔离级别,就会出现并发问题。

事务的并发问题以及具体体现

问题类型 说明

脏读

对于两个事务,t1,t2,如果T1读取了已经被t2修改过的但是还没有提交的数据,但是最后t2回滚了,t1读取的内容是临时并且无效的

不可重复读

 对于两个事务,T1,T2读取了一个字段的值,但是T2更新了这个字段,T1再次读取的时候,两读取的数据是不一致的

幻读

对于两个事务T1,T2,T1从一个表中按照一定的条件读取数据,接着T2将表进行了更新,插入几行新数据,当T1再次以相同的条件进行读取的时候,会出现新的数据

补充:

不可重复读更加侧重于对数据的修改,解决办法:将满足条件的行锁起来。

幻读更加侧重于新增数据或删除数据,解决办法:锁表。

MySQL数据库的隔离级别 

隔离级别 说明

未提交读

READ UNCOMMITTED:

(读取未提交的数据),允许事务读取未被其他事务提交的更改,所以脏读、不可重复读、幻读都会出现

已提交读

READ COMMITTED

READ COMMITTED:

(读取提交内容)    只允许事务读取已经被其他事务提交的更改,能够解决脏读问题,但是不可重复读和幻读没有解决

可重复读(可重读)

REPEATABLE READ:

确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务多这个字段进行更新,可以避免脏读和不可重复读,但是幻读还是会出现的

可序列化(可串行化)

SERIALIZABLE:

确保事务可以从一个表中读取相同的行,在这个事务持续期间,不允许其他事务对于表数据执行插入,更新和删除操作,会解决所有的并发问题,但是性能很低

注意:隔离级别从小到大安全性越来越高,但是效率越来越低

设置隔离级别

set session|global  transaction isolation level 隔离级别名;

查看隔离级别

#第一种
select @@transaction_isolation;

#第二种
show variables like 'transaction_isolation';

你可能感兴趣的:(MySQL数据库,数据库,mysql,sqlserver)