事务和事务的隔离级别

目录

一.事务的特性

a.原子性(atomicity)

b.一致性(consistency) 

c.隔离性(isolation)

d.持久性(durability)

二.事务并发引发的问题

a.脏读

b.不可重复读 

c.幻读 

 三.SQL标准中的四种隔离级别


一.事务的特性

事务具有4个属性:原子性 ,一致性 ,隔离性,持久性。这四个属性通常称为ACID特性。

a.原子性(atomicity)

一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不能只执行其中的一部分操作。

比如:A给B转账1000元

1.A账户余额减少1000元

2.B账户余额增加1000元

整个事务的操作要么全部成功,要么全部失败。不可能出现A账户余额扣除,但是B账户余额不增加的情况。如果原子性不能保证,就会导致一致性出现问题。

b.一致性(consistency) 

一致性是指将事务从数据库一种一致性转换到另外一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。

比如:A给B转账1000元

1.A账户余额减少1000元

2.B账户余额增加1000元

减少的钱(-1000)与增加的钱(1000)相加应该为0。或者说A账户和B账户的余额加起来 ,前后应该不变。

c.隔离性(isolation)

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

如果隔离性不能保证,可能会出现以下问题:

则转完帐后A的余额还是9000元,但是B的余额已经是2000元,多出来的1000元就说不清楚了。

d.持久性(durability)

一旦事务提交,则其所做的修改就会永远保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失。

二.事务并发引发的问题

事务并发主要引起的问题有三种:脏读,不可重复读,幻读。

a.脏读

当一个事务读取到了另外一个事务修改但未提交的数据,就被称为脏读

b.不可重复读 

当事务内相同的记录被检索两次,且两次得到的结果不同时,此现象就被称为不可重复读

c.幻读 

在事务执行过程中,另一个事务将新记录添加到正在读取的事务中时,会发生幻读

幻读与不可重复读有些类似,但是幻读重点强调读取到了之前读取没有获取的记录。另一方面幻读主要是与insert相关,而不可重复读主要与update相关。 

 三.SQL标准中的四种隔离级别

首先先明确一点,隔离级别越高,并发性就越低,性能也就越低,但是越安全。但是不能一味地只追求安全性,而不考虑性能。同时也不能只追求性能,不考虑安全性。二者都需要考虑,达到一个合适的度。因此,SQL标准就被制定出来了。在标准中设立了4个隔离级别。

READ UNCOMMITTED:读未提交

READ COMMITTED:读已提交

REPEATABLE READ:可重复读

SERIALIZABLE:可串行化

MYSQL的默认隔离级别是REPEATBLE READ。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值