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

以前写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。

时间: 2024-10-13 13:03:35

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

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

SendMessage Return Values The return value specifies the result of the message processing and depends on the message sent. 这个返回值就是由相应的响应消息函数的返回值. 例如: 有自定义消息:WM_USER 其响应函数: LRESULT Cexample::OnUser(WPARAM wParam, LPARAM lParam) { //…. return 0; } 则用Se

(转)如何编写有多个返回值的C语言函数

1引言    笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题.有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值:或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回.这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑

shell获取函数的返回值

背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的. 定义一个函数 functionname(){ 操作内容 echo 输出内容 return 返回值 #返回值可有可不有 } 获得函数的返回值 1.函数默认是将标准输出传递出来,不是返回值. 所以如果直接调用functionname,实际上是将输出传递回来 例如: a=`functionname` 将函数functionname的标准输出传递给a 2.调用函数不需要加()

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

[转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT u

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

有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);  ⑵ 参数:  lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数).  uCmdShow:定义Windows应用程序的窗口如何显示,并为Creat

深入了解MyBatis返回值

深入了解MyBatis返回值 想了解返回值,我们需要了解resultType,resultMap以及接口方法中定义的返回值. 我们先看resultType和resultMap resultType和resultMap 大家应该都知道在MyBatis的<select>标签中有两种设置返回值的方式,分别是resultMap和resultType. 处理resultMap和resultType的代码如下: private void setStatementResultMap( String resu

&lt;Java&gt; 类 方法 参数传递 返回值类

类 用class关键字可以传建一个类. 类中可以设置两种类型的元素:字段(有时被称为数据成员),方法(有时被称为成员函数) 字段  字段即数据成员 字段可以是任何类型的对象(可以是是引用类型,也可以是基本类型) (3) 每个对象都有用来存储其字段的空间,普通字段是不可以在对象间共享的 两个对象都各自有他们自己的字段,虽然字段是同名的,但是这两个对象对这个字段的操作都是对自己的字段的操作,不能操作另一个对象的. 但是static修饰的字段,是在对象内共享的,他只有一份空间,不管是那个对象,对这个字

python基础 函数定义 返回值 参数

函数定义 1 #python中函数定义.def函数定义的关键字,fun1函数名,x为函数的形参可以有多个,多个之间用“,”隔开:return 函数返回值的关键字,python中return可以是非必要 2 def fun1(x): 3 x += 1 4 return x 函数返回值 1 # 函数返回值可以有多个,之间使用“’”分隔,返回值讲多个值组成的元组进行返回. 当无return时python会隐式return “None”,如果只返回一个值就返回这个值本身 2 def fun2(x, y)

趣谈函数调用与返回值

今晚看老毕的视频时看到了函数的那块,视频中老毕写了一个算术方法,然后通过主函数调用它,方法得到参数后得到返回值再传给主函数.在提到标示返回值类型时,老毕说了一个很生动形象的例子 首先,来谈谈定义,当函数运算后,没有具体返回值时,这时返回值类型用一个特殊的关键字来标示,该关键字是void.当函数中的返回值类型是void时,函数中的return语句可以省略不写.好了,接下来谈谈老毕的那个形象的例子-----假设老毕是方法,同学是主函数,同学要买盒饭就要调用老毕,先给他钱,也就是“传参”,然后老毕返回