我需要特定的业务场景来在实体(不是PK)上的字段中设置序列中的数字(序列必须是介于min和max之间的数字
我定义了这样的序列:
CREATE SEQUENCE MySequence MINVALUE 65536 MAXVALUE 4294967296 START WITH 65536 INCREMENT BY 1 CYCLE NOCACHE ORDER;
在Java代码中,我从这样的序列中检索数字:
select mySequence.nextval from dual
我的问题是:
如果我select mySequence.nextval from dual在一个事务中调用此“ ”,并且在另一个事务中同时调用了同一方法(并行请求),则可以确定该序列返回的值是否不同?
不可能像从第一笔交易中读取未提交的值吗?
因为让我们说我不会使用序列和一个普通的表,在这里我会增加自己的序列,那么如果事务处理是默认的“ READ COMMITTED”,则事务2将能够读取相同的值。
答案是不。
Oracle保证按顺序生成的数字是不同的。即使发出并行请求,RAC环境或回滚和提交也会混合在一起。
序列与事务无关。
看到这里的文档:
使用CREATE SEQUENCE语句创建一个序列,该序列是一个数据库对象,多个用户可以从中生成 唯一的 整数。您可以使用序列自动生成主键值。 生成序列号时,该序列将递增, 而与提交或回滚的事务 无关 。如果两个用户同时增加同一序列,则每个用户获取的序列号可能会有间隔,因为序列号是由另一个用户生成的。一个用户永远无法获取另一用户生成的序列号。一个用户生成序列值后,该用户可以继续访问该值,而不管该序列是否被另一用户递增。 序列号是独立于表生成的,因此同一序列可用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。此外,单个用户可能不会意识到其他用户正在从相同的序列进行绘制。
使用CREATE SEQUENCE语句创建一个序列,该序列是一个数据库对象,多个用户可以从中生成 唯一的 整数。您可以使用序列自动生成主键值。
生成序列号时,该序列将递增, 而与提交或回滚的事务 无关 。如果两个用户同时增加同一序列,则每个用户获取的序列号可能会有间隔,因为序列号是由另一个用户生成的。一个用户永远无法获取另一用户生成的序列号。一个用户生成序列值后,该用户可以继续访问该值,而不管该序列是否被另一用户递增。
序列号是独立于表生成的,因此同一序列可用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。此外,单个用户可能不会意识到其他用户正在从相同的序列进行绘制。