数据库-事务隔离

数据库-事务隔离


数据库 事务

事务的概念:事务就是一个对数据库操作的序列,是一个不可分割的工作单位,要不这个序列里面的操作全部执行,要不全部不执行。

事务:指一组SQL语句;
回退:指撤销指定的SQL语句过程;
提交:指将未存储的的SQL语句结果写入数据库表;
保留点:指事务处理中设置的临时占位符,可以对它发布回退;

数据库 ACID四大特性

事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持久性)四个词的首字母所写。
原子性: 组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。

银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。

一致性: 在事务处理执行前后,MySQL数据库是一致的。也就是说,事务应该正确的转换系统状态。

银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。

隔离性: 一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。

银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。

持久性: 事务处理的效果能够被永久保存下来。

转账结果能够在无论发生什么情况下都能保存下来.。

数据库 脏读、幻读、不可重复读、事务丢失

脏读: (读取了未提交的新事物,然后被回滚了)

事务A读取了事务B中尚未提交的数据。如果事务B回滚,则A读取使用了错误的数据。

比如A给B转了100万,但是A还没有提交,此时B查询自己账户,多了100万。然后A发现转错人了,回滚了事物。然后B100万就没了。  
在过程中A查到了没有提交事物的数据(多出的100万),这就是脏读。

解决: 如果 一个事物在读的时候,禁止读取未提交的事物。是不是就解决了。

不可重复读: (读取了提交的新事物,指更新操作)

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如同一个事物前后两次查询同一个数据,期望两次读的内容是一样的,但是因为读的过程中,因为令一个数据写了该数据,导致不可重复读。
解决: 如果 一个事物在读的时候,禁止任何事物写。是不是就解决了。

幻读:(也是读取了提交的新事物,指增删操作)

在事务A多次读取构成中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。幻读和不可重复读的区别在于, 不可重复是针对记录的update操作,只要在记录上加写锁,就可避免;幻读是对记录的insert操作,要禁止幻读必须加上全局的写锁(比如在表上加写锁)。

解决: 如果一个事物加上表级锁,只要有任何东西操作这个表的时候,禁止任何操作的并发

第一类事物丢失:(称为回滚丢失)

对于第一类事物丢失,就是比如A和B同时在执行一个数据,然后B事物已经提交了,然后A事物回滚了,这样B事物的操作就因A事物回滚而丢失了。

比如A有1000元。买一个东西,花了100元。然后B给A转了1000元。
理论上这两个事物正常的话,A应该还有1900元。

但是比如现在两个A,B事物同时进行,第一步都先查询我余额还有1000元,然后B事物给我转了1000元,提交了,理论上我还有2000元。然后我买东西,100元的,买到一半,我事物回滚,就回滚成了1000元。(回滚丢失)如果我不回滚,也提交了,我就还剩900元(也就是下面介绍的第二类事物丢失,覆盖丢失)。

第二类事物丢失:(提交覆盖丢失)

对于第二类事物丢失,也称为覆盖丢失,就是A和B一起执行一个数据,两个同时取到一个数据,然后B事物首先提交,但是A事物加下来又提交,这样就覆盖了B事物,称为第二类事物丢失,覆盖丢失。

数据库 隔离级别

读未提交:一个事务a可以在其他事务b未提交前,读取b操作的数据。这个隔离级别容易造成脏读。
读已提交:事务a只能等事务b提交后,才能读取到最新提交后的数据,能解决脏读问题。
可重复读:顾名思义,事务a开始对一数据操作后,到提交前这一段时间内,就算事务b对同一数据进行修改并提交,数据a所读取的某条数据的值都是一致的。也就是说事务a开始到提交这段期间所读取的数据,不收外界影响,形成可重复读。
顺序读(串行读):解决一切脏读,不可重复度,幻读问题。但事务只能串行执行。

事务隔离级别 脏读 不可重复度 幻读
READ_UNCOMMITTED ✔ ✔ ✔
READ_COMMITTED × ✔ ✔
REPEATABLE_ABLE × × ✔(mysql中不产生)
SERIALIZABLE × × ×

MySql中默认的事务隔离级别为可重复读 REPEATABLE_ABLE。Oracle、Sql Server等大部分数据库,默认的事务隔离级别所读提交READ_COMMITTED。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值