程序员

mysql事务概念简要(1)

2020-06-20  本文已影响0人  洛克黄瓜

并发控制

一种提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据(最理想的方式),而不是所有的资源。锁定范围越小,并发性越高。大多数数据库都是在表上施加行级锁,并以各种复杂的方式来实现。

事务

事务就是一组原子性的SQL执行,或者说一个独立的工作单元。事务内的语句,要么全部执行成功,要么全部执行失败。

严格意义上来说,一个运行良好的事务应该具备4个标准特性:ACID

隔离级别

死锁

死锁是指两个或多个事务在同一资源上互相占用,并请求对方占用的资源。
Innodb目前处理死锁的方式是,将持有最少行级排他锁的事务进行回滚(这是相对简单的死锁回滚方法)。

多版本并发控制-MVCC(Multi-Version Concurrency Control)

  • MySQL的大多数事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,他们一般都实现了各自的MVCC。包括Oracle,PostgreSQL等其他数据库也都实现了MVCC,只是机制不尽相同,MVCC没有一个统一的实现标准。
  • 可以认为MVCC是行级锁的一个变种,很多情况下它可以避免加锁操作,因此开销更低。
  • MVCC的实现,是通过保存数据在某个时间点的快照来实现的。

\color{red}{PS}:下面仅仅是大意的说明,实际上行记录隐藏列是创建事务id、undo log指针,还有一个delete bit标记。

不同存储引擎的MVCC的实现是不同的,典型的有乐观并发控制和悲观并发控制。从下文可以看出innodb的MVCC实现属于乐观并发控制:

保存这两个额外的系统版本号,使大多数的读操作都可以不用加锁。可以不加锁去做到安全的并发,这可不就是乐观并发控制嘛!不足之处是需要额外的存储空间,还有一些额外行检查工作、维护工作。
MVCC只是在可重复读和提交读这两个隔离级别下工作。其他两个隔离级别不兼容,因为未提交读总是读最新数据而不管隐藏列的事务版本,可串行化则对所有读取的行都会加锁。

PS:脏读 VS 幻读的理解

其实这两个概念没有什么联系,只是名称都带个读而已。就我的理解而言:

上一篇下一篇

猜你喜欢

热点阅读