数据库中的并发事务,及并发事务的两种机制

13 篇文章 0 订阅
7 篇文章 0 订阅

数据库中的并发事务,及并发事务的两种机制

为了解决数据库并发事务时,可能会产生的数据不一致,数据库提供了隔离级别和锁。

数据库中并发事务出现的问题

1)脏读:数据库并发访问的情况下,不同的事务对同一条数据操作,事务A修改数据未提交时,事务B读取了该数据修改后的结果,但事务A回滚rollback,未提交。导致事务B读取了事务A未提交的数据,即读未提交。
2)不可重复读:事务A过程中,读取了事务B提交的修改某条数据的结果,导致在事务过程中,前后两次读取的结果不一致。即读已提交。
3)幻读:事务A前后两次读取,后一次读取的数据更多了(insert),事务B在两次读取期间插入了数据。

隔离机制

为了解决数据库中并发事务出现的数据不一致的问题,数据库提供了隔离机制。

背景:myisam存储引擎不支持事务和行锁,支持表锁。
innodb存储引擎支持事务行锁表锁。

隔离级别

read-uncommited(读未提交):最低的隔离级别,允许读取未提交的数据,不能避免脏读,不可重复读,幻读。
read-commited(读已提交):允许读取并发事务已提交的数据。
避免了脏读,不能避免不可重复读,幻读。
repeatbale-read(可重复读):并发事务中,多次读取的结果一致。
避免了脏读,不可重复读,不能避免幻读。
socializable(可串行化):事务一次执行,互不干扰。
避免了脏读,不可重复读,幻读。

可重复读实现原理

事务ID是递增的。
使用MVCC(多版本并发控制)。InnoDB为每行记录添加了一个事务ID,每当修改数据时,将当事务ID写入。
在读取事务开始时,系统会给事务一个当前版本号(事务ID),事务会读取版本号<=当前版本号的数据,这时就算另一个事务插入一个数据,并立马提交,新插入这条数据的版本号会比读取事务的版本号高,因此读取事务读的数据还是不会变。

为了让数据库并发事务的隔离机制实现,数据库提供了锁。
数据库有并发事务时,可能会产生数据不一致,这是需要一些机制来保证访问次序,锁就是这样的机制。
不能滥用锁:锁的各种操作消耗资源。
隔离级别越低,锁的请求越少。
mysql的默认隔离界别是repeatable-read(不可重复读)。
大部分的数据库操作系统如oracle的默认隔离界别是read-commited。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值