1.什么是内连接、左(外)连接、右(外)连接、外连接
内连接:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
左连接:left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
右连接:right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
(全)外连接
2.数据库的事务有哪些特性?
ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。原子性(Atomicity):事务是数据库逻辑工作单元,事务中包含的操作要么执行成功,要么都执行失败。一致性(Consistency):事务要保证数据库整体数据的完整性和业务的数据的一致性,事务成功提交整体数据修改,事务错误则回滚到数据回到原来的状态;隔离性(Isolation):一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。持久性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
3.数据库中的隔离等级有哪些?
先简单介绍一下什么是脏读,不可重复读,幻读脏读是一个事务读取到另一个事务的中间状态的数据;不可重复读是一个事务读取到另一个事务提交后更新的数据,导致该事务前后两次读取的数据不一致;幻读是一个事务在读取某个范围内的数据时由于另一个事务在该范围内添加或删除了某些数据,导致该事务前后两次读取的数据量不一致;隔离等级:未提交读(READ UNCOMMITTED)事务中的修改,即使没有提交,对其它事务也是可见的。提交读(READ COMMITTED)一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。可重复读(REPEATABLE READ)保证在同一个事务中多次读取同样数据的结果是一样的。可串行化(SERIALIZABLE)强制事务串行执行。隔离级别 脏读 不可重复读 幻影读 加锁读未提交读 √ √ √ ×提交读 × √ √ ×可重复读 × × √ ×可串行化 × × × √
4.乐观锁和悲观锁
https://zhuanlan.zhihu.com/p/40396971
https://zhuanlan.zhihu.com/p/50098743
https://juejin.im/post/5b4977ae5188251b146b2fc8
定义:悲观锁(Pessimistic Lock): 每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。乐观锁(Optimistic Lock): 每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。适用场景:悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。总结:两种所各有优缺点,读取频繁使用乐观锁,写入频繁使用悲观锁。