以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值;
因为可能其他线程并发访问nextval()。

先说结论吧:
当你拿到一个数据库连接,先nextval(),
然后无论其他再怎么操作这个sequence,你用current()取得的值一直都会与你刚才nextval()的取值相同

此时才明白了为什么当我想在数据库中直接查看某个sequence的currval时,报错,必须要先nextval(),才能执行currval()

我做了一个实验,用同一个用户开两个数据库连接A、B

第一步
用连接A调用nextval(),取得值为1
用连接A调用current(),取得值总为1;

第二步
用连接B调用nextval(),取得值为2
用连接B调用current(),取得值总为2;

第三步
然后在用连接A调用current(),取得值仍然为1;

以下内容转自百度贴吧http://tieba.baidu.com/f?kz=185551317,文中应该专指Informix数据库,部分可能不完全适用与其他数据。

使用 NEXTVAL
第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。

在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定 sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。

除了在同一语句中多次出现这种情况以外,每个 sequence.NEXTVAL 表达式都会增加序列,无论后来是否提交或回滚当前事务。

如果在最终回滚的事务中指定 sequence.NEXTVAL,某些序列数可能被跳过。

使用 CURRVAL
任何对 CURRVAL 的引用返回指定序列的当前值,该值是最后一次对 NEXTVAL 的引用所返回的值。用 NEXTVAL 生成一个新值以后,可以继续使用 CURRVAL 访问这个值,不管另一个用户是否增加这个序列。


果 sequence.CURRVAL 和 sequence.NEXTVAL 都出现在一个 SQL 语句中,则序列只增加一次。在这种情况下,每个
sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回相同的值,不管在语句中 sequence.CURRVAL 和
sequence.NEXTVAL 的顺序。

序列的并发访问
序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。

当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 1、4、6 和 8,而另一个用户并发地从同一序列生成值 2、3、5 和 7。

想取得刚才nextval()的值时,放心大胆的用currval()吧,currval()的返回值并不会因为nextval()的并发访问而混乱的更多相关文章

  1. Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

    子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...

  2. SendMessage的返回值,就是由相应的响应消息函数的返回值(解释的简洁明了)

    SendMessage Return Values The return value specifies the result of the message processing and depend ...

  3. .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)

    最近在项目中与别的公司对接业务,对方是Java语言,需要调用对方的WebServices,结果常规的添加web引用的方法可以传过去值,但是返回值为null 查了很多资料,没有解决方法 思考应该是.Ne ...

  4. C# 调用 C++ 的 DLL 返回值为 bool 时,值混乱

    现象:C++ 导出函数的返回值为 false,C# 调用该函数获取的返回值却为 true . 原因:C++ 导出函数返回 false 时,采取的方式是: 将 C# 定义的用来接收返回值的 bool 所 ...

  5. 2. Bean Validation声明式校验方法的参数、返回值

    你必须非常努力,才能干起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...

  6. [转]WinExec、ShellExecute和CreateProcess及返回值判断方式

    [转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/23924 ...

  7. asp.net模态窗口返回值

    个人感觉模态窗口在做网站的时候,使用到的比较少,前段时间在做项目时要实现以模态窗口传值和接收返回值, 模态窗口传值实现比较简单,但是做好后发现在Chrome浏览器中接收不到返回值,修改好Chrome浏 ...

  8. return 的返回值与结束功能

    前言:大家好~我是阿飞~在js中return是很重要的基础.一定要彻底掌握理解它哦.否则js学习到中后期很容易懵逼的+_+ 什么是return? 1.在js中return是一个表达式语句,如果后面什么 ...

  9. 深入了解MyBatis返回值

    深入了解MyBatis返回值 想了解返回值,我们须要了解resultType,resultMap以及接口方法中定义的返回值. 我们先看resultType和resultMap resultType和r ...

随机推荐

  1. 基于Oracle的SQL优化(崔华著)-整理笔记-工具集

    一.脚本display_cursor_9i.sql是可以得到SQL的真实执行计划,使用示例 使用示例,请看以下case 1.执行测试sql: SELECT T1.*,T2.* FROM T_0504 ...

  2. 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”

    第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...

  3. python 字符串、列表、字典相关内建方法

    """字符串相关内建方法""" # a = ["qwe", "name", "sex&qu ...

  4. API To Import Negotiations(转)

    原文地址 API To Import Negotiations

  5. 动态创建OATipBean

    动态创建OATipBean. 动态创建的OATipBean无法直接设置提示内容,需要添加一个静态文本. 参考User Guide示例如下. If you need to create a tip pr ...

  6. JS object(对象)的学习汇总

    Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象,而每一个事物都有自己的表示的属性和对于某一信息作出的相应的操作.而这些东西就变成了事物的属性和方法. ...

  7. [转载]CentOS 6.3安装Subversion服务器

    转载自http://www.cnblogs.com/zhoulf/archive/2013/02/02/2889949.html 安装说明 系统环境:CentOS-6.3 安装方式:yum insta ...

  8. Fragment在Activity中跳转,实现类似新闻标题跳转新闻内容功能

    1.准备的工作,新闻数据类,新闻数据适配器,适配器的布局: News.java package com.example.zps.fourfragmentbestpractice; /** * Crea ...

  9. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  10. Java语言发展史和eclipse配置

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...