利用oracle中的序列巧解併發流水號問題

2021-07-24 20:34:51 字數 1499 閱讀 5189

問題背景分析:

在行式填報表中,可以通過使用流水號來作為自增長型主鍵進行資料的更新。在這種情況下,多使用者併發批量新增若干資料的時候,就可能會產生由於主鍵衝突而導致的併發插入資料失敗。原因是潤幹自帶流水號是根據資料表的主鍵id欄位的max()值為基礎、通過自加或自減實現遞增或遞減的流水號,這種流水號的遞增或遞減都是基於客戶端的,當多使用者併發的時候必然會引起衝突。這時,就需要在伺服器的資料庫端解決該問題。

oracle資料庫提供了序列的功能,利用oracle的序列,從資料庫伺服器端按照一定規則直接賦值生成乙個流水號,就可以解決客戶端併發時流水號相同的情況。

解決思路步驟(oracle建立序列):

一、在oracle表中建立乙個序列

create sequence name

increment by x //x為增長間隔

start with x //x為初始值

maxvalue x //x為最大值

minvalue x //x為最小值

cycle //迴圈使用,到達最大值或者最小值時,從新建立物件

cache x //制定快取序列值的個數

——–乙個例子——–

create sequence for_test -序列名

increment by 1 -每次增加1

start with 1 -從1開始

nomaxvalue -沒有最大值

nocache -沒有快取序列

———-建立測試表——

create table test

(testid int primary key,

testname varchar2(20) not null,

tdescription varchar2(200) null)

———-使用序列——-

insert into test

values(for_test.nextval,』序列測試』,』這是乙個序列使用的例子』)

——-序列使用結果查詢——

select * from test

二、在潤幹報表中建立資料集

在潤幹報表中建立乙個資料集,語句如下:

select for_test.nextval seq from dual //查詢自己建立的序列的序列號

三、在報表單元格中使用

在需要的單元格中像一般的資料集使用一樣,直接寫ds.seq使用即可。這樣每重新整理或是查詢一次,oracle會根據序列表的設定賦值。

四、基於序列seq欄位建立乙個流水號

在報表中建立乙個流水號,在流水號的初值表示式中直接寫:ds.seq*100000;具體需要的單元格中增加填報屬性的流水號計算公式,設定為:++var1。這樣在新增一條資訊時,獲取的流水號均唯一賦值。

這樣,對於同乙個行式填報表的大批量併發插入操作可能導致的主鍵衝突問題就迎刃而解了。

oracle中的序列

oracle中的序列 sequence 的作用相當與sqlserver中的identify作為乙個表的自動增加且唯一標識的列 下面我就用乙個簡單的序列來實現 1.建立序列 create sequence sq sq宣告乙個序列的名稱 start with 1 宣告序列的開始值 immediate b...

oracle中的序列

什麼是序列?序列 可供多個使用者用來產生唯一數值的資料庫物件 自動提供唯一的數值 共享物件 主要用於提供主鍵值 將序列值裝入記憶體可以提高訪問效率 create sequence 語句 createsequence sequence increment by n start with n 建立序列 ...

Oracle中的序列

序列入門 首先建立t1表 create table t1 id number 10 primary key,name varchar2 8 建立乙個序列 create sequence seq1 insert into t1 id,name values seq1.nextval,a insert ...