> Multi Transactions

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
_______________________________________________________________________________________________________


这五种情况,个个都非常重要!因为这是保证 数据 尽可能做到准确,完整,一致。
这需要我们思考?
不是解决问题是重要的,问题提出同样是重要的。即时数据库系统默认帮我们做掉了很多事務上的問題,但是我們仍然需要解決一些不可預知的多事務問題,給客戶更好的服務,更智能的問題解決方案。我們的目標就是盡可能的保證數據准确,完整,一致,并且我們會一直保持研究這方面的解決方法.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值