Mysql系列一:事物概念及特性


一、事物概念及特性

1.1、概念

在数据库系统中,事物代表的是一个操作或者一系列操作的最小逻辑单元,在这个逻辑单元内的所有的操作要么全部成功执行,要么全部失败,不存在有的成功有的失败的清空,事物提交之后,事物内的所有操作都会被保存

1.2、原子性

原子性是指在事物内的多个操作,要么全部执行,要么全部失败。

1.3 、一致性

数据库从一个一致性状态变到另一个一致性状态 ,如数据的一致性。以转账为例,若A拥有1000元B拥有400元,他们的总数是1400元,A向B转账600元之后,无论是否出现异常,AB的总数依然是1400元

1.4、隔离性

不同事物之间的操作互不影响,如A事物内的操作在B事物中是无感的,B事物只能读取到A事物提交前的数据或提交后的数据。

1.5、持久性

事物提交之后,会永久性的保存到磁盘中,数据不会丢失。

二、标准事物的隔离级别

事物隔离级别实现方式
未提交读(RU)读取:不加锁
写数据:在更新数据的瞬间加行级共享锁,直到事物结束才会释放。
提交读(RC)读取:在读取数据的瞬间加行级共享锁,读完立即释放
写数据:在更新数据的瞬间加行级排他锁,直到事物结束才会释放。
可重复读(RR)读取:在读取数据的瞬间加行级共享锁,直到事物结束释放。
写数据:在更新数据的瞬间加行级排他锁,直到事物结束才会释放。
序列化(S)读取:在读取数据时加表级别共享锁,直到事物结束才会释放。
写数据:事物更新数据时加表级排他锁,直到事物结束才会释放。

不过Mysql中引入了MVCC版本控制,与之有所不同。

三、Mysql事物的隔离级别

2.1、读未提交(READ UNCOMMITTED)

开启事物A开启事物B
查询余额1000
查询余额1000
update 余额 1500
查询余额1500
提交事物
提交事物

在A事物未提交时,B事物可以获取到A事物未提交的数据,这种现象称为脏读

2.2、读已提交(READ COMMITTED)

该隔离级别解决了脏读问题,具体措施就是,在修改数据时,进行加写锁,等待事物提交或者回滚才会释放锁,但并未阻塞读取,Mysql读取时引入MVCC版本控制,每次都会读取最新的版本,避免脏读问题。但会出现不可重复读的问题,A事物修改之后并提交,此时B事物再次读取数据不一致。

开启事物A开启事物B
查询余额1000
查询余额1000
update 余额 1500
查询余额1000
提交事物
查询余额1500(数据不一致)
提交事务

可以发现,B事物在第三次读取的时候,A事物提交了,B读取数据不一致,称为不可重复读

2.3、可重复读

该级别下,事物读取的操作会对数据加读锁,并且事物释放时才会释放锁,所以此时另一个事务若是修改想要加写锁的话是加不上的,需要等待释放另一个事物释放读锁才能继续。

但mysql默认隔离级别,解决不可重复读的措施现在是通过MVCC版本控制读取唯一视图,而并非上述的加锁情况,后续再详细讲解。因为是行级锁,所以可能会产生幻读的情况。

注意: mysql在该级别通过MVCC以及锁机制解决了幻读的问题,不需要升级成序列化级别。

比如:幻读时发生在范围查询时,没有对在该范围内不存在的数据进行加锁(如 10>id>5可能没有6,7,8的数据),而导致在此时我插入数据6、7、8的时候可以成功,而下次再次查询就多出来了条数据。使用 **间隙锁 **可以避免这种情况,这儿先提一嘴,后面再详细讲解。

2.4、序列化

最高隔离级别,事物顺序执行,添加表级别锁,读取表级别共享锁,写入表级别排他锁,事物提交后才会释放所有的锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值