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

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);

事务并发处理: DB+ORM+逻辑代码的更多相关文章

  1. k.tt 研究下生成的逻辑代码:从壹开始前后端分离 [.netCore 填坑 ] 三十二║ 四种方法快速实现项目的半自动化搭建

    更新 1.更新小伙伴 @大龄Giser 提出好点子:试试VS的插件扩展:VSIX.ItemProject等,将T4模板给制作插件,这里先记下,有懂的小伙伴可以自己先试试,我会在以后更新. 2.感谢小伙 ...

  2. JSBinding+Bridge.Net:框架代码与逻辑代码的关系

    在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏. 框架代码:简称framework,表示那些不进行热更的代码.注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngi ...

  3. HIbernate学习笔记(九) hibernate事务并发处理与乐观悲观锁

    事务并发处理 一. 数据库的隔离级别:并发性作用. 1.   ReadUncommited(未提交读):没有提交就可以读取到数据(发出了Insert,但没有commit就可以读取到.)很少用 2.   ...

  4. JSBinding+Bridge:逻辑代码中操作二进制数据

    以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...

  5. FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码

    FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...

  6. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  7. [MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解

    一.缘由 众所周知MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务.支持行级锁. 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失.脏读.不可重复 ...

  8. 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误ICM_HTTP_SSL_PEER_CERT_UNTRUSTED

    当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD ...

  9. 使用CodeBenchmark对逻辑代码进行并发测试

    一直对性能测试比较感兴趣,所以也写了不少的测试工具有WebApiBenchmark和TcpBenchmark等;但这些工具测试都是有针对性和配置的方式来进行功能有限所以很难适用更多的场景,所以单独开发 ...

随机推荐

  1. .Net 内存泄露

    一.事件引起的内存泄露 1.不手动注销事件也不发生内存泄露的情况 我们经常会写EventHandler += AFunction; 如果没有手动注销这个Event handler类似:EventHan ...

  2. POI中设置Excel单元格格式样式(居中,字体,边框等)

    创建sheet什么的就不多说了,直接进入正题 HSSFCellStyle cellStyle = wb.createCellStyle();   一.设置背景色: cellStyle.setFillF ...

  3. C# MongoDB--时区问题(差了8小时)

    原因:MongoDB中存储的时间是标准时间UTC +0:00C#的驱动支持一个特性,将实体的时间属性上添加上这个特性并指时区就可以了.例如:[BsonDateTimeOptions(Kind = Da ...

  4. WordPress 主题开发 - (四) 创建WordPress的主题HTML结构 待翻译

    Now we're starting to get into the real meat of WordPress Theme development: coding the HTML structu ...

  5. 用Python的smtp模块发邮件的示例

    # -*- coding: UTF-8 -*- import smtplib from email.mime.multipart import MIMEMultipart from email.mim ...

  6. java作用域public ,private ,protected 及不写时的区别(转)

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...

  7. 信驰达携“Zigbee Light Link灯控方案”亮相第18届广州国际照明展

    2013年6月9日至12日,第18届广州国际照明展览会在琶洲中国进出口商品交易会展馆举行,作为全球照明及LED行业风向标和晴雨表,本次展会吸引了来自27个国际及地区,共2600多家企业参展.我公司受T ...

  8. [terry笔记]ArchiveLog归档日志激增解决思路

    归档日志激增的危害是巨大的,最严重的结果就是数据库无法正常工作,导致整个系统无法正常工作,其次就算数据库可以正常工作,但激增的归档会对磁盘产生大量消耗,导致性能下降.       归档日志激增一般是因 ...

  9. 解决Unable to resolve superclass的问题

    之前在GITHUB上看到大蛋的高级设置,昨晚于是就拿来编译.. 结果真是个悲伤的故事,放手机上居然运行不了,这种时候只能看LOG了! 看LOG得出的信息如下: - ::): threadid=: in ...

  10. java中的接口回调

    [接口回调]接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中 ...