数据库相关知识

DBA

Database administrator。大公司一般才有这个职位。小公司,一般都研发的自己去写SQL语句,小公司也没多大数据量不需要做什么数据库优化之类的。主要工作就是写SQL语句,生成报表,优化数据库性能之类的工作。

isolation

什么是事务

该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态。

事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

例如银行转账情景,账户A向账户B转100块钱,有如下步骤,从账户A中转出100块钱,向账户B中转入100块钱,必须这两个操作都执行成功,才认为转账流程成功结束。

因为写代码的时候,一般的编程模型,都是先扣除账户A的100块钱,再向账户B中增加100块钱。如果扣除账户A钱失败时,显然后继步骤不用执行了。在向账户B中加钱失败时,需要将100块钱还给账户A。

我自己的理解的话,数据库支持事务,是为了保证数据的一致性。

数据库隔离级别,之前面试的时候偶尔会被问到,算是比较基础,也很重要的一个关于数据库事务方面的支持。

这是最简单的一种情况,实际生产环境中,还存在多线程的情况,即有多个线程在同时读取更新数据。然后会有事务隔离级别的问题。

未提交读(Read uncommitted)
已提交读(Read committed)
可重复读(Repeatable read)
可串行化(Serializable)
未提交读

A、B两个事务,数据为4,B事务修改数据为8,A事务读取到修改后的数据得到8,然而之后B事务执行失败,数据回滚为4。

失败的应用情景:B事务账户充值,A事务账户支付,本来A事务需要支付8块钱,B事务充值4块钱,然而充值失败发生了退款,A事务拿到的是8块钱的数据,因此支付成功了,导致了不一致性。

已提交读

一般用这个级别就够了。

可重复读
A事务在开始阶段读取了数据,后继阶段也读取了数据,还是读取到一样的数据;因为其他事务在这个时间段会插入数据,可重复度避免了这种情况。

可串行化

实际中基本不用,事务执行完全串行化,性能太差。

sharding

数据库的水平划分和垂直划分。

水平划分是指,单表的记录数过多,将单表数据分散存储在多表中。比如说资源记录表 resource,水平划分之后,单表固定存储 1000W 条记录,超出之后,resource_0,resource_1 依次存储。

垂直划分,是将单表中的字段拆分为多表,比如 resource 有 text、desc 字段,分别存储为 resource_text,resource_desc 表。

sharding 的作用在于降低单点数据量,提高系统性能,提高数据存储的安全性。

deadlock

和事务,并发都有关系。举个简单不靠谱的例子,我喜欢你,你喜欢他,他喜欢我,得了都单着吧,成循环了都。

数据库里,事务A、事务B,都需要R_1,R_2,才能完成事务,但是事务A获取到R_1,事务B获取到R_2,两个事务都没有获取到足够的资源,都在等待,永远没法结束了,这就是死锁。