事务并发处理: 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);

 

posted on 2016-04-28 14:10  -赶鸭子上架-  阅读(580)  评论(0编辑  收藏  举报