database

数据库系统原理

事务

概念:事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

  1. 原子性(Atomicity)
    事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
  2. 一致性(Consistency)
    在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
  3. 隔离性(Isolation)
    一个事务所做的修改在最终提交以前,对其它事务是不可见的。
  4. 持久性(Durability)
    一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系:

  • 只有满足一致性,事务的执行结果才是正确的。
  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
  • 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
  • 事务满足持久化是为了能应对系统崩溃的情况。

并发一致性问题

  1. 丢失修改:丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。
  2. 读脏数据:读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。
  3. 不可重复读:不可重复读指在一个事务内多次读取同一数据集合。
  4. 幻影读:幻读本质上也属于不可重复读的情况,T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

查询时的注意事项(一般是报表等功能)

关联查询时,当某个查询条件需要引入新的连接表,且不方便直接放在 sql 中作为查询条件(连接条件较为复杂,包含大于等于或小于等于关系运算),可将该查询条件转化为已经存在的连接表的查询条件;
缺点:每次查询前需要先查数据库转化查询条件;查询出来的数据需循环查数据库,设置该条件字段的具体值。
优点:sql出问题的风险低,不会担心某张表数据一多改sql运行较慢,阿里不推荐三张以上表的join。

//join 中可以用 <=连接;查询条件的账期段跟数据库的账期段关联起来  
SELECT
    odb.*,    
    odi.*,
    od.do_date,
    fch.accounting_month
FROM
    od_do_batch odb
INNER JOIN od_do_items odi ON odb.do_items_id = odi.do_items_id
INNER JOIN od_do od ON odb.do_no = od.do_no
INNER JOIN fi_company_his fch ON od.company_id = fch.company_id
AND fch.begindate <= DATE_FORMAT(od.do_date, '%Y-%m-%d')
AND fch.enddate >= DATE_FORMAT(od.do_date, '%Y-%m-%d')
WHERE
    od.do_status = 10450025
and ((fch.begindate &lt;= DATE_FORMAT(now(), '%Y-%m-%d') and fch.enddate &gt;= DATE_FORMAT(now(), '%Y-%m-%d'))
      ||(fch.begindate &lt;= DATE_FORMAT(now(), '%Y-%m-%d') and fch.enddate &gt;= DATE_FORMAT(now(), '%Y-%m-%d'))
      ||(fch.begindate &gt;= DATE_FORMAT(now(), '%Y-%m-%d') and fch.enddate &lt;= DATE_FORMAT(now(), '%Y-%m-%d')))
ORDER BY
    do_no DESC
LIMIT 0,10  

包含查询条件的连接表需要使用 inner join 连接,让查询条件生效?(对头)

性能描述

  • 大多数关系型数据库支持 每秒 200-2000次的增删改操作
  • 单表行数超过 1000w 或者容量超过 2GB,才推荐进行分库分表
  • 一个数据库大概存放 300张左右的表