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

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. Cassandra 计数器counter类型和它的限制

    文档基础 Cassandra 2.* CQL3.1 翻译多数来自这个文档 更新于2015年9月7日,最后有参考资料 作为Cassandra的一种类型之一,Counter类型算是限制最多的一个.Coun ...

  2. Redis监控方案

    Redis 监控最直接的方法当然就是使用系统提供的 info 命令来做了,你只需要执行下面一条命令,就能获得 Redis 系统的状态报告. redis-cli info 内存使用 如果 Redis 使 ...

  3. Thinkphp 获取当前url

    $_GET['_URL_'] 获取整个url,返回值是数组 $Think.MODULE_NAME 获取当前class的名称 $Think.ACTION_NAME 获取当前action的方法名称

  4. Oracle表变化趋势追踪记录

    #DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...

  5. C#中Image , Bitmap 和 BitmapData

    先说Image,Image 就是个图像,不能实例化,提供了位图和源文件操作的函数.本篇文章他就是来打酱油的,这里提供一个Bitmap转成BitmapSource的方法. [DllImport(&quo ...

  6. sql server 判断是否存在数据库,表,列,视图

    1 判断数据库是否存在if exists (select * from sys.databases where name = '数据库名')    drop database [数据库名] 2 判断表 ...

  7. DoubanFm之设计模式(一)

    前两版DoubanFm写的太戳,第一版可以忽略,当是熟悉WP手机的一些API.. 第二版用了比较多的依赖注入,熟悉了Messenger,过后越写越大,感觉不对,赶快打住..现在开始好好思考各模块了. ...

  8. android 连续点击退出程序

    package com.test.twiceexit; import java.util.Timer; import android.app.Activity;import android.os.Bu ...

  9. ios中怎么样调节占位文字与字体大小在同一高度

    在设置好字体以后,在占位文字中设置leading这个字体属性,用leading来乘以一个比例(CGFloat)来调节位置.

  10. python生成带参数二维码

    #coding:utf8 import urllib2 import urllib import json import string import random class WebChat(obje ...