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

事务并发处理: DB+ORM+逻辑代码的更多相关文章
- k.tt 研究下生成的逻辑代码:从壹开始前后端分离 [.netCore 填坑 ] 三十二║ 四种方法快速实现项目的半自动化搭建
更新 1.更新小伙伴 @大龄Giser 提出好点子:试试VS的插件扩展:VSIX.ItemProject等,将T4模板给制作插件,这里先记下,有懂的小伙伴可以自己先试试,我会在以后更新. 2.感谢小伙 ...
- JSBinding+Bridge.Net:框架代码与逻辑代码的关系
在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏. 框架代码:简称framework,表示那些不进行热更的代码.注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngi ...
- HIbernate学习笔记(九) hibernate事务并发处理与乐观悲观锁
事务并发处理 一. 数据库的隔离级别:并发性作用. 1. ReadUncommited(未提交读):没有提交就可以读取到数据(发出了Insert,但没有commit就可以读取到.)很少用 2. ...
- JSBinding+Bridge:逻辑代码中操作二进制数据
以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...
- FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- [MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解
一.缘由 众所周知MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务.支持行级锁. 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失.脏读.不可重复 ...
- 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误ICM_HTTP_SSL_PEER_CERT_UNTRUSTED
当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD ...
- 使用CodeBenchmark对逻辑代码进行并发测试
一直对性能测试比较感兴趣,所以也写了不少的测试工具有WebApiBenchmark和TcpBenchmark等;但这些工具测试都是有针对性和配置的方式来进行功能有限所以很难适用更多的场景,所以单独开发 ...
随机推荐
- 封装document.ready方法
function $(fn){ if(document.addEventListener){ //W3C document.addEventListener('DOMContentLoaded',fu ...
- JS中的控制函数调用:call(),apply()和bind()
所有的函数都具有call(),apply()和bind()方法.它们可以在执行方法的时候用一个值指向this,并改变面向对象的作用域. apply方法: 以下的两种表达式是等价的: func(arg1 ...
- c语言学习第四天数据类型1
int 代表整数,它在内存中占4个字节,二进制的表示方式是占用了三十二位,二进制中只包含0和1,那它的最大值就是全为1,但int是 有符号类型,所以最高位(左边的第一位)要拿出来做符号位,这样就只 ...
- JSON.stringify 语法实例讲解
语法: JSON.stringify(value [, replacer] [, space]) value:是必选字段.就是你输入的对象,比如数组,类等. replacer:这个是可选的.它又分为 ...
- Enum枚举类型的使用笔记
好处: 1.可以直接使用switch 2.可以实现toString()方法 笔记: 1.枚举类头部定义的成员变量,可以看做是枚举类的一个实例 public enum Color { RED(" ...
- SSM框架
1.http://www.cnblogs.com/verlen11/p/5349747.html 2.Mybatis http://www.cnblogs.com/xdp-gacl/p/4261895 ...
- ubuntu miss tool bar
reson: unity exception 1. open terminal: /usr/bin/**terminal** 2. run command on terminal: gsetting ...
- ios中怎么样转行大小写
转换大小写:lowercaseString(小写) uppercaseString(大写)
- 52.ISE中的PLL时钟输入
在manaul mode中选择PLL PLL的输入时钟可以是全局时钟,也可以是普通IO引脚. 1.PLL的输入时钟是全局时钟的情况. pll_xx pll_xx ( .clkin ( clkin ), ...
- 在51系列中data,idata,xdata,pdata的区别
在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码 也最小. idata:固定指前面 ...