一些需求要求两次查询数据之间不允许数据被修改,即可重复读取

可重复读REPEATABLE READ与串行化SERIALIZABLE的区别在于串行化要求满足该查询的数据不被修改且无新满足该查询条件的数据插入(使用范围锁),可重复读只要求数据不被修改(保留S锁至事务结束)。

而在read commit事务隔离级别下,被更新的数据会被加S锁,并一直保持事务提交或回滚,因此数据在事务区间内不能被其他事务修改,也保证了两次查询得到数据不发生变化(数据的值而不是行数)

因此我们可以使用几种方式来保持数据不发生变化:

方式1:在提交读隔离级别下使用HOLDLOCK
HOLDLOCK相当于SERIALIZABLE隔离级别,会对数据加范围锁(Range-S)共享锁S并一直保持到事务结束

方式2:在提交读隔离级别下对数据进行UPDATE
这样对数据加U锁,U锁会保持到事务结束,这样阻塞了其他事务对该数据的读取(U锁与S锁不兼容)

方式3:将隔离级别设置为
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ|SNAPSHOT|SERIALIZABLE

Transaction And Lock--两种方式实现可重复读的更多相关文章

  1. java中实现同步的两种方式:syschronized和lock的区别和联系

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

  2. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  3. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  4. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  5. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  6. Go基础系列:Go实现工作池的两种方式

    worker pool简介 worker pool其实就是线程池thread pool.对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池. 在线程池模型中,有2个队 ...

  7. DAO层注入HibernateTemplate的两种方式

    -------------------------siwuxie095                                         DAO 层注入 HibernateTemplat ...

  8. 多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  9. 14 线程间协作的两种方式:wait、notify、notifyAll和Condition

    原文链接:http://www.cnblogs.com/dolphin0520/p/3920385.html 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者- ...

随机推荐

  1. leetcode706

    class MyHashMap { public: vector<int> hashMap; /** Initialize your data structure here. */ MyH ...

  2. 将本地Jar包安装到maven仓库中去

    开发中会遇到无法通过pom.xml下载jar包的情况,遇到这种情况我们可以手动在本地安装jar包到本地仓库中去,这样就可以下次再用到的话不用再次联网下载,具体以oracle的驱动包ojdbc6.jar ...

  3. spring与mybatis

  4. spring与IOC,ioc与di的关系

  5. Half Lambert

    [Half Lambert] Half Lambert was a technique created by Valve as a way of getting the lighting to sho ...

  6. html学习代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. 使用zTree展开节点后,覆盖了下一个节点

    如图所示,结果是zTree与<fieldset>标签不兼容....我去!!! 也就是说Ztree不能放在<fieldset>标签中..

  8. Hibernate多对多操作

    ---------------------siwuxie095 Hibernate 多对多操作 以用户和角色为例 (一)多对多映射配置 第一步:创建两个实体类,用户和角色 第二步:让两个实体类之间互相 ...

  9. 303. Range Sum Query 范围求和系列

    Immutable [抄题]: Given an integer array nums, find the sum of the elements between indices i and j (i ...

  10. CloudFoundry 快速上手笔记

    1.登陆cf 2.登陆进入webservice 3.查看ruby版本 4.查看gem版本 5.安装CF 6.配置cf Download the CLI from github: https://git ...