1.什么是数据库事物?如果没有事物会有什么后果?事物的特性是什么?
事物是操作的集合,即一个单元的一系列SQL语句的集合,事物要么完全执行,要么完全不执行,如果不对数据库进行并发操作,可能会产生脏读,幻读,不可重复度,数据丢失等情况。
事物的特性(ACID)
A.atomacity原子性:事物必须是原子工作单元,即事物是不可分割的最小单元,事物当中的所有操作必须全部完成或者全部失败。比方说:小王向小李转了1000,在这个事物当中会发生2个操作,这两个操作是不可分割的,不能给小王减了但是小李却没加。
C:consistency一致性:事物是将数据库的状态从一种状态改变为另一种状态,比方说:小王向小李转了1000,在这个事物当中会发生2个操作,小王的账户减1000,小李的账户加1000,这个事物完成之后,二者的总和不变。这就是一致性
I:isolation隔离线:在并发操作时,2个事物之间是相互隔离的,即一个事物的影响在在该事物提交之前对其他事物是不可见的。
durability持久性:事物完成之后,他对于系统的影响是持久性的,即使出现致命的系统故障,该事物的影响也会存在。
2.什么是脏读?幻读?不可重复度?什么是事物的隔离级别?MySql的默认隔离级别是什么?
(一)脏读幻读不可重复读
脏读:事物A读取到事物B未提交的数据,当事物B回滚以后,事物A读取到的就成了脏数据。
不可重复读:事物A多次读取同一条数据,在事物A读取的同时,事物B对给数据进行了更新并提交,这导致事物A读取到的数据不一致。
幻读:事物A将Student表的性别全部改为男,此时事物B将表当中插入一条性别为女的记录,当事物A再次查看的时候会发现一条性别为女的记录,就好像有一条未修改,产生幻觉了一样。
(二)事物的隔离级别
read uncommitted读未提交:一个事物可以读取到另一个事物为提交的数据,如果数据库的隔离级别设置为此,会产生脏读。
read committed读提交:一个事物读取到另一个事物已经提交的数据,比如:小明在商城买东西,当他要付钱的时候系统检测到卡里有10000,当要付钱的时候发现卡里没钱了,原来小明的老婆在同一时间转了10000到自己的卡里,所以小明付款失败。
这就是读提交,若要事物要对数据进行更新操作,则读操作事物要等到更新操作事物完毕之后才可以进行,可以解决脏读,但会出现一个事物范围内返回结果不同的2条数据,这就是不可重复读。
Repeatable read重复度:重复度,在进行读取数据的时候(事物开启),不允许再修改(update)操作。
比如:小明在商城买东西,当他要付钱的时候系统检测到卡里有10000,这是小明的老婆就不能转钱了,接下来收费系统就乐意扣款了。它能够避免不可重复度。
Serializable序列化:它是数据库的最高隔离级别,可以避免幻读,但是比较耗数据库性能,一般不使用。
当小明的老婆查看消费明细的时候发现花费了1000,此时小明又消费了200,当小明的老婆打印消费明细的时候,发现总共花了1200,好像产生了幻觉一样,幻读只有将数据库的隔离级别设置为序列化的时候才可以避免。
3.MySql默认隔离级别?
Repeatable read
4.事物的隔离是怎么实现的?
是基于锁实现的
(一)有那些锁?分别介绍下?
在DBMS当中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎),页级锁(BDB引擎), 表级琐(MYISAM引擎)
行级锁(INNODB引擎):行级锁是MySql当中粒度最细的一种锁,表示指对当中操作的行进行加锁,行级琐可以大大减少数据库操作的冲突,其锁粒度最小,但加锁的开销最大,行级琐分为共享锁和开销锁
它的特点是:开销大,加锁慢;锁粒度最小,发生冲突的概率最低;并发最高
页级锁(BDB引擎):页级琐四Mysql当中锁粒度介于行级琐于表级琐之间的,表级琐锁读快,但是冲突多,行级琐冲突少,但是速度慢,页级琐介于二者之间。
特点:开销于加锁时间介于表锁于行锁之间;会出现死锁;锁定粒度基于二者之间,并发一般
表级琐(MYISAM引擎):表级琐是MySql当中锁粒度最大的一种锁,表示对当前操作的整张表进行加锁,它的实现简单,资源消耗较少,被大多数的MySql引擎支持。最常用的MYISANM于INNODB都支持表级锁定,表级琐分为共享读锁(共享锁)与表独占锁(排他锁)
特点:开销小,加锁速读快;锁粒度最大,发生锁冲突的概率最高;并发最低
5.什么是死锁?怎么解决死锁?
传统意义上的死锁指的是两个或者多个线程相互持有对方需要的资源,等待释放,这就导致这些线程都处于等待的状态,无法执行,导致死锁。
死锁产生的根本原因是对共享存储区域的访问,在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。加锁是数据库并发控制的一种重要手段,数据库当中有两种基本类型的锁,共享锁和排他锁,当数据对象被加上排他锁的时候,其他的事务不能对它读取和修改,当数据对象加上共享锁的时候,其他的数据事物可以对该数据对象进行读取,但是不能修改。
常见的造成死锁的原因及解决方案:
(一)事物之间对资源访问顺序的交替
原因:用户A 访问表A(锁住了表A),然后又访问表B;用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。
解决方案:这种死锁是由于程序的BUG导致的,比较常见,尽量约定以相同的顺序来访问表,可以大大减少死锁的概率。如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。即B用户先访问A资源,然后A用户在访问B资源。
(二)并发修改同一记录
6.Mysql数据库引擎有那些?为什么查询用MYISAM,更新用INNODB?
主要引擎有MYISAM,INNODB
INNODB在select的时候要维护的东西比MYISAM多得多:
1)数据块:INNODB要维护数据块,MYISAM只要缓存索引块。
2)INNODB寻址要映射到块,再到行,MYISAM寻址是直接到文件的OFFSET,定位比INNODB块
3)INNODB还需要维护MVCC:虽然你的场景没有用到,但是他还是要去维护,MVCC(Multi-Version Concurrency Control)多版本并发控制。
INNODB与MYISAM的区别?
INIMNODB:支持事物,由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。
MYISAM:MyISAM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,只支持表级琐,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyISAM也是很好的选择。
简单介绍区别:
1、MyISAM是非事务安全的,而InnoDB是事务安全的
2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁
3、MyISAM支持全文类型索引,而InnoDB不支持全文索引
4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM
5、MyISAM表保存成文件形式,跨平台使用更加方便
应用场景:
1、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyISAM
2、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB