A.
对于开发商而言,最重要的就是产品的质量/可用性/以及可维护性等,这可是主要重要,还有次要重要,例如:客户反映情况/内部开发团队合作情况等;
对于客户而言,最重要的是什么? 两个字:数据. 客户最关注的是数据的准确性,完整性,一致性等.然而对于软件的质量/可用性/以及可维护性等等,这些关注程度并非很强烈.最起码是在"客户最关注的是数据的准确性,完整性,一致性"之后.
--------------------------------------------------------------------------------------------------
B.
OLTP(在线事务处理) 交互式时间较短的企业应用系统(一般系统 例如ERP/CRM/SCM/OA/HR/..... 执行时间较短的交互式系统
OLAP(在线分析处理) 交互式时间较长的企业分析系统(对于分析大量数据,需要执行长时间的系统)具有企业决策类型的多粒度方体解决方案
--------------------------------------------------------------------------------------------------
C.
多事务 (对于企业什么最重要,数据)尽可能做到准确,完整,一致。对于下面
Begin Transaction
......
Commit / Rollback
......
End Transaction
在熟悉不过了。在单用户的并非同一时刻并非在并发环境下, 也就是Transaction / Commit / Rollback,看起来没什么,也不过要么都成功执行就Commit,否都Rollback。但只是单事务,简称单事务窜行化。
但是多事务是在并发环境下产生的,也就是多个事务,多个事务在某一时刻多个用户程序同时访问同一数据库系统的状态。注意: 多事务运作导致并发问题。这里有几个概念:
1.多个事务 (数量而非事务本身:解释可能有嵌套事务;还有例如:6个事务不一定是6个客户程序)
2.某一时刻(同一时刻:也包括同一段时间范围)
3.多个用户程序(不一定是一个产品,例如:可能是ERPWinApp / ERPWebApp / HR 多个系统;多个系统当中用户)
4.同一数据源(并非一种数据库系统,可能有多个数据库系统组成,且有可能操作的相同数据来自多数据库中多张表)
不采取隔离手段:就会发生下面5种情况(数据库默认是已Commit的事务) 事务A ☆ 事务(B/C/D...) ★
情况名称 情况解释 事务中包括的数据库操作
-------------------------------- ------------------------------------------------- --------------------------
1.《 第1类数据丢失更新 》 撤销 ☆ 时,把 ★ 已commit的更新数据覆盖 Update
2.《 数据脏读 》 ☆ 读到 ★ 未commit的更新的数据 Select / Update
3.《 数据虚读 》 ☆ 读到 ★ 已commit的新插入的数据 Select / Insert
4.《 数据不可重复读》 ☆ 读到 ★ 已commit的更新的数据 Select / Update
5.《 第2类数据丢失更新 》 这是 4. 的一种特殊情况, ☆ 覆盖 ★ 已commit的更新的数据 Update
_______________________________________________________________________________________________________
1.并发环境下产生的两个事务导致 《 第1类数据丢失更新 》 ←→↖↗↘↑↙↓¥√≠
时间 取款事务 支票转账事务
--------------- ------------------- -----------------------------------
T1 begin transaction
T2 begin transaction
T3 Query 1000¥
T4 Query 1000¥
T5 汇入100¥,改变为1100¥
T6 commit
T7 取出100¥,改变为900¥
T8 rollback,改变为1000¥(丢失更新了,把支票转账事务覆盖掉了,我的帐户少加了支票转账事务的100¥)
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
2.并发环境下产生的两个事务导致 《 数据脏读 》 ←→↖↗↘↑↙↓¥√≠
时间 取款事务 支票转账事务
--------------- ------------------- -----------------------------------
T1 begin transaction
T2 begin transaction
T3 Query 1000¥
T4
T5 取出100¥,改变为900¥
T6 Query 900¥(脏读)
T7 rollback,改变为1000¥
T8 汇入100¥,改变为1000¥
T9 commit
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
3.并发环境下产生的两个事务导致 《 数据虚读 --- (SQL标准 称 幻影读) 》 ←→↖↗↘↑↙↓¥√≠
时间 取款事务 支票转账事务
--------------- ------------------- -----------------------------------
T1 begin transaction
T2 begin transaction
T3 Query 统计注册客户总数为 10000 个
T4 注册一个新客户
T5 commit
T6 Query 统计注册客户总数为 10001(虚读)就怀疑到底是10000个,还是10001个?
T7
T8
T9 commit(事实当中一般很少两次查询同样的数据)
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
5.并发环境下产生的两个事务导致 《 数据不可重复读(or数据非重复读) 》 ←→↖↗↘↑↙↓¥√≠
时间 取款事务 支票转账事务
--------------- ------------------- -----------------------------------
T1 begin transaction
T2 begin transaction
T3 Query 1000¥
T4 Query 1000¥
T5 取出100¥,改变为900¥
T6 commit
T7 Query 900¥
T8 汇入100¥,就怀疑到底要改变为1000¥+100¥=1100?还是900¥+100¥=1000¥?
T9 commit
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
5.并发环境下产生的两个事务导致 《 第2类数据丢失更新 》 ←→↖↗↘↑↙↓¥√≠
时间 取款事务 支票转账事务
--------------- ------------------- -----------------------------------
T1 begin transaction
T2 begin transaction
T3 Query 1000¥
T4 Query 1000¥
T5 取出100¥,改变为900¥
T6 commit
T7
T8 汇100¥,改1100¥(丢失更新了,把取款事务覆盖了,银行亏100¥,没扣除取款事务100¥
T9 commit
_______________________________________________________________________________________________________
这五种情况,个个都非常重要!因为这是保证 数据 尽可能做到准确,完整,一致。
这需要我们思考?
不是解决问题是重要的,问题提出同样是重要的。即时数据库系统默认帮我们做掉了很多事務上的問題,但是我們仍然需要解決一些不可預知的多事務問題,給客戶更好的服務,更智能的問題解決方案。我們的目標就是盡可能的保證數據准确,完整,一致,并且我們會一直保持研究這方面的解決方法.