事务:事务实际上就是一组操作,这组操作里的操作要么都成功,要么都失败。
Mysql中操作数据库的基本操作:
**1、开启一个事务(start transaction):**输入这个命令后,可以进行一系列的指令,如果没有输入提交指令而关闭窗口的话,下次打开显示的还是被修改前的数据。
**2、提交一个事务(commit):**提交事务后,才是真正的将修改的数据写入数据库。
**3、回滚(rollback):**让所有的操作都失效,回归最开始的状态。
事务的特性:
**1、原子性:**一件事务,看成一个不可拆分的整体,要么全部运行要么不运行。
**2、一致性:**数据库从一个一致的状态转换为另一个一致的状态。
**3、隔离性:**不同事务之间互不影响。
**4、持久性:**事务一旦提交,对数据库的改变就是永久的。
事务并发时的问题:
**1、脏读:**读到另一个 事务未提交的。比如有a,b两个线程,b对变量c进行操作,将c本来为1改成2,然后a去读取c,读到的就是2.如果b进行回滚,c变回1。这个时候a读到的c不是c在数据库中真正的值。
**2、不可重复读:**根据名字就知道,指的是两次读取到的内容不一样。比如还是b对数据c进行更改,c本来的值为1改成2,那么在b对a进行修改前后读到的c的值是不一样的,这就是不可重复读。
**3、幻读:**当事务不是独立运行时发生的一种现状。比如a对表中数据进行修改,b对表中数据增加,然后a对表中所有数据修改后,会发现还在数据没有修改(b增加的数据)。不可重读读和幻读都是读到另一个事务已经读到的事务,不可重复读重点在读到同一数据项,而幻读重点在一批数据的整体。不可重复读对应的是update,幻读对应的是insert和delete。
事务的隔离级别:
**1、读未提交:**可以读取其他事务尚未提交的数据。最低的级别,并发时的问题都有
**2、读提交:**读取其他事务提交了的数据。一个事务要等另一个事务读提交后才能读取。可以避免脏读,其他都不行。
**3、可重复读:**在开始读取数据后,不允许对数据进行修改。可以避免脏读,不可重复度。
**4、串行化:**事务串行化顺序执行。可以避免脏读,不可重复读,幻读。
数据库有哪些锁:
**共享锁:**表示对事务进行读操作,多个事务可以同时为同一对象加锁,但是不允许事务对对象进行修改。
**排他锁:**表示对事务进行写操作,一旦一个事务对对象加上排他锁,在没有释放锁之前。就不允许其他事务对对象加锁。
**表锁:**锁的粒度比较大,开销小,加锁释放锁快,不容易死锁,但是并发性不高。
**行锁:**锁的粒度比较下,开销大,加锁释放锁需要的资源比较多,容易死锁,但是并发性高,不容易冲突。
数据库的索引有什么作用? 底层数据结构是什么,为什么使用这种数据结构?
答:
- 索引 是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;
- 两个常用的索引是MyISAM和InnoDB,底层数据结构是 B+ 树,B+树是只有在叶子节点存储数据,MyISAM和InnoDB在叶子节点存储数据的方式不一样,MyISAM的叶子节点存的是指向实际数据的指针,而InnoDB存的是实际的数据。
- 使用 B+ 树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数,而且b+树的结构是一个节点不止存一个树,可以有效的减少树高,提高查询效率。
MyISAM 和 InnoDB 的区别有哪些?
答:
1、MyISAM 不支持事务,InnoDB 是事务类型的存储引擎;
2、MyISAM 只支持表级锁,InnoDB 支持页级锁和表级锁,默认为页级锁; 而 InnoDB 支持行级锁和表级锁,默认为行级锁;
3、MyISAM 引擎不支持外键,InnoDB 支持外键;
4、MyISAM 引擎的表在大量高并发的读写下会经常出现表损坏的情况;
5、对于 count( ) 查询来说 MyISAM 更有优势;
6、InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的;
7、MyISAM 支持全文索引(FULLTEXT),InnoDB 不支持;
MyISAM 引擎的表的查询、更新、插入的效率要比 InnoDB 高。最主要的区别是:MyISAM 表不支持事务、不支持行级锁、不支持外键。 InnoDB 表支持事务、支持行级锁、支持外键。(可直接回答这个)