mysql特性和锁

1、 数据库事务有哪些特性
事务:事务是数据库最基本的执行单位,要么全都执行,要么都不执行。
(1)原子性:事务是最小的执行单位,逻辑上不允许分割,事务的原子性保证操作要么全部完成,要么全部失败。
(2)一致性:执行事务前后,数据保持不变,多个事务对同一数据的读取结果是相同的。
(3)隔离性:并发访问数据库时,一个用户的事务不会被其他事务所干扰,各并发事务访问的数据库是独立的。
(4)持久性:是指一个事务被提交之后,他在数据库中修改的数据是永久的,不会因为数据库发生故障而影响。

2、什么是脏读,不可重复度,虚读?
(1)脏读:一个未提交事务读取了另一个未提交事务修改的数据。
(2)不可重复读:一个未提交事务读取了另一个提交事务修改的数据。
(3)虚读:一个事务连续读两次数据,读取数据量不一样

3、根据锁是否独占,锁可以分为共享锁和排它锁
(1)共享锁(简称S锁):又被称为读锁,其他用户可以并发读取数据,但任何事务都不能获取数据上的排它锁,直到释放所有的共享锁。
(2)排它锁(简称X锁):又被称为写锁,若事务T对数据对象A加上了写锁,则只允许事务T对对象A进行读取和修改,其他任何事务都不能再对A加任何类型的锁,知道T释放了A上的锁。

4、按锁的粒度把数据库锁分为表锁和行锁
(1)表锁:对当前操作的整张表加锁,实现简单,加锁快,不死锁,但并发能力低。。
(2)行锁:只针对当前操作的行加锁。行锁可以大大减少数据库操作的冲突,其加锁粒度最小,并发度高,但加锁开销也大,加锁慢,会出现死锁。
(3)Record Lock记录锁:锁住某一行,如果表存在索引,那么记录锁是锁在索引上的,可以避免数据在查询的时候被修改的重复读问题,也可以避免修改事务未提交的脏读问题。
(4)Gap Lock间隙锁:是一种记录行与行之间的空隙,对索引之间的间隙加锁,不包含开始的索引。
(5)Next-key-Lock:锁定索引项本身和索引范围。NK是一种记录锁和间隙锁的组合锁,既锁住行业锁住间隙。可解决虚读行为。

5、意向共享锁和意向排它锁
Innodb同时支持行锁和表锁。但行锁和表锁的同时存在会发生冲突,如A申请了行共享锁,而B再申请表互斥锁。这时B不仅需要查看是否已经存在其他表锁,以及逐个查看是否存在行锁,效率太低。于是又引入了意向锁。意向锁是一种表级锁,用来指示接下来的一个事务将要获取的是什么类型的锁(共享还是独占)。意向锁分为意向共享锁(IS)和意向独占锁(IX),依次表示接下来一个事务将会获得共享锁或者独占锁。
(1)意向共享锁(IS):事务打算给数据行加上共享锁,事务再给一个数据行加上共享锁前必须获得该表的IS锁。
(2)意向排它锁(IX):事务在给一个数据行加上排它锁之前必须获得该表的IX锁。

6、乐观锁和悲观锁是什么,怎么实现的
数据库管理系统中的并发控制任务就是确保多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性,以及数据库的统一性。乐观锁和悲观锁就是并发控制主要采用的手段。
乐观锁:在访问数据之前,默认不会有其他事务对数据进行修改,所以先访问数据,然后再查找期间有没有其他事务修改数据。这不是数据库自带的,需要我们自己去实现,一般基于版本去实现。
**悲观锁:**假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据之后就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制。
**两种使用场景:**乐观锁适用于写操作比较少的情况,悲观锁适用于写操作多的情况。

7、什么是死锁,怎么解决?
死锁是指两个或多个事务对同一资源相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。解决方法
(1)如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
(2)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。
(3)对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁来减少产生死锁的概率。

15、MySQL有几种引擎,有什么区别
(1)InnoDB引擎:提供了对数据库ADIC事务的支持,并且还提供了对行级锁和外键的约束。他的设计目标就是处理大数据容量的数据库系统
(2)MyISAM引擎:不提供事务的支持,也不支持行锁和外键
(3)MEMORY:所有的数据都在内存中,数据的处理较快,但是安全性不高。
区别:
(1) MyISAM不支持事务,而InnoDB支持事务。
(2)MyISAM是表级锁,而InnoDB是行级锁。
(3)MyISAM不支持外键,而InnoDB支持。
(4)MyISAM以文件形势存储,跨平台使用更加方便。
(5)MyISAM是非聚簇索引,InnoDB是聚簇索引。
MyISAM适合没有事务,读比较比较密集
InnoDB适合要求事务,写密集高并发

16、MVCC
(1)MVCC多版本并发控制器,指的是一种高并发技术。最早的数据库系统,只有读读之间可以并发,其他的都要阻塞。引入多版本之后,只有写写之间相互阻塞,这样大幅度提高了InnoDB的并发度。
(2)每一个写操作都会创建一个新版本的数据,读操作会从有限多个版本的数据中挑选一个最合适的结果直接返回。MVCC只在READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作;
(3)对于使用InnoDB存储引擎的表来说,他的聚簇索引记录中包含两个必要的隐藏列:(trx_id事务ID、roll_pointer上个版本指针),每次对记录进行改动,都会把对应的事务ID赋值给trx_id隐藏列,也会把旧版本写入到日志中。
(4)所以在并发情况下,一个记录可能存在多个版本,同过roll_pointer形成一个版本链。MVCC的核心任务就是判断版本链中的哪个版本是当前事务可见的。这就有了readView的概念,这个ReanView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务ID放到一个列表中,这个列表叫m_ids,根据ReadView的活跃事务ID列表和版本链事务ID进行比较找出可见的事务ID最大的版本:
1、如果版本的trx_id属性值小于m_ids列表中最小的事务id,表明生成该版本的事务在生成ReadView前已经提交,所以该版本可以被当前事务访问。
2、如果版本的trx_id属性值大于m_ids列表中最大的事务id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
3、被访问版本的trx_id属性值在m_ids列表中最大的事务id和最小事务id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。
MVCC只在读已提交和可重复读这两个隔离机制下运行。这两个隔离机制下MVCC实现方式的区别就在于:读已提交是每次读取数据前都生成一个ReadView;而可重复读,是在第一次读取数据时生成一个ReadView,后序的重复查询就不再生产ReadView了。

总结:
多版本并发控制器指的就是在使用READ COMMITTD/ REPEATABLE READ这两种隔离级别的事务,在执行普通select操作时访问记录的版本链的过程,这样子可以使不同事务的读写,写读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级别一个很大的不同就是生成readView的时机不同,READ COMMITTD在每一次进行普通select操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通select操作前生成一个ReadView,之后的查询操作都重复这个ReadView就好了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值