zoukankan      html  css  js  c++  java
  • 事务并发处理: DB+ORM+逻辑代码

    在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用。

    1. 事务:一系列操作要么都完成,要么一个都不完成

    2. 事务并发:多个事务同时进行

    3. 事务特点:ACID,原子性、一致性。。。

    4. 事务并发可能带来的3大类问题:

       1) dirty read(脏读)

      一个事务读取了另外一个事务未提交的数据。

       2) non-repeatable read(不可重复读)

      同一事务中,前后读取的数据不一致。

       3) phantom read(幻读)

      类似不可重复读,但针对插入/删除操作。

     5. DB处理事务并发/ORM处理事务并发/逻辑代码处理事务并发

        1) DB处理事务并发

      均采用事务隔离机制,分4种事务级别:Read_Uncommited,Read_Commited,Repeatable_Read,Serializable.

      Read_Uncommited: 可读取未提交数据,存在以上3大类问题

      Read_Commited: 可读取提交数据,解决脏读但未解决不可重复读和幻读

      Repeatable_Read: 可重复读,解决脏读和不可重复读

      Serializable: 序列化,全部解决但效率最低

      对应以上事务级别,DB会有相应的锁实现。

      比如MySQL, InnoDB下,默认为Repeatable_Read的事务级别(select @@tx_isolation from table)

        2) ORM处理事务并发

      ORM,比如Hibernate,实际上是对JDBC的轻量级封装,因此对应JDBC,Hibernate也有其事务隔离级别:(可查询java.sql.Connection)

      1. Read_Uncommited; 2. Read_Commited; 4. Repeatable_Read; 8. Serializable

      (对Hibernate的配置,可以参考http://www.cnblogs.com/elleniou/archive/2012/12/01/2797546.html

      可以通过hibernate.connection.isolation进行设置。

        3) 逻辑代码处理事务并发

       一般情况下,为达到性能和准确的折中,会设置DB的事务隔离级别为Read_Commited, 然后在逻辑代码中处理不可重复读的问题。

       不可重复读的处理需要用到乐观锁/悲观琐。

       乐观锁:认为本事务中处理的数据很可能不会受其他事务的影响。

        操作:对每条DB记录加入版本号,每次事务提交时都要检查版本号。若版本号前后不一致,证明该条记录被其他事务更改,需要其他操作处理。

           Hibernate注解:@Version

       悲观锁:认为本事务处理的数据很可能会受到其他事务的影响。

        操作:利用DB的锁对数据进行加锁操作,防止其他事务的影响。

           例如:session.load(One.class, 1, LockMode.Upgrade);

     

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    thinkphp计划任务使用cronRun-Thinkphp3.1版
    AJAX 跨域请求
    可以做外汇交易接口的网站
    thinkphp 定时执行php文件 php自动执行php文件
    关于major、minor的解释
    Codeforces Round #370 (Div. 2) A B C 水 模拟 贪心
    2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
    Codeforces Round #280 (Div. 2) A B C 暴力 水 贪心
    codevs 1299 线段树 区间更新查询
    Codeforces Round #260 (Div. 2) A B C 水 找规律(大数对小数取模) dp
  • 原文地址:https://www.cnblogs.com/hello-yz/p/5442491.html
Copyright © 2011-2022 走看看