你這里要考慮并發(fā)與業(yè)務(wù)邏輯的一個平衡。但是事實上只能先保證業(yè)務(wù)正確,那么就需要對同一條記錄(即同一個單子)進行線性操作了。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出銀海免費做網(wǎng)站回饋大家。
最簡單的,利用oracle存儲過程的事務(wù)原子性和行鎖機制就可以解決。
比如:
create or replace procedure aaa( ...)
as
v_count number;
begin
....
select count(*) into v_count from tbl where id=123 for update;
-- 利用for update鎖住對應這個單號的這條記錄。這樣,在這個存儲過程沒有commit之前,別的存儲過程對id號(你的單號)為123的記錄的for update查詢只能等待。
..... 處理你的業(yè)務(wù)邏輯;
update tbl set amout=amout+1 where id=123; 這里把跟單人數(shù)加1.
... 其他邏輯
end;
/
通過數(shù)據(jù)庫引擎的鎖機制、內(nèi)存操作、日志機制等。
鎖機制保證同一時的數(shù)據(jù)不會被多外同時寫或覆蓋。
內(nèi)存是把操作的數(shù)據(jù)都放在內(nèi)存。
日志機制,是修改數(shù)據(jù)后,先寫日志,再寫數(shù)據(jù)。
不能連接Oracle數(shù)據(jù)庫了 提示相關(guān)的錯誤
OERR: ORA TNS:no appropriate service handler found
客戶端連接間歇性失敗 報錯ORA
Cause: the listener could not find any available service handlers that are
appropriate for the client connection
Action: run lsnrctl services to ensure that the instance(s) have registered
with the listener and are accepting connections 檢查lsnrctl service instance已經(jīng)注冊
狀態(tài)顯示ready時 可以連接
When the listener believes the current number of connections has reached maximum load
it may set the state of the service handler for an instance to blocked and begin refusing
ining client connections with either of the following errors: ora or ora
采用服務(wù)動態(tài)注冊的方式 由PMON 通過SERVICE_UPDATE 來得到目前連接情況 但SERVICE_UPDATE 有時間間隔
所以 listener顯示的連接數(shù)和當前實際的連接數(shù)可能不同
查詢解決方法:
查看一下數(shù)據(jù)庫現(xiàn)有的進程數(shù) 是否已經(jīng)達到參數(shù)processes的大小
select count(*) from v$process;???????????????????????? 取得數(shù)據(jù)庫目前的進程數(shù)
select value from v$parameter where name = processes ; 取得進程數(shù)的上限
如已達到上限 修改initSID ora中的processes的大小
重新啟動數(shù)據(jù)庫到nomount狀態(tài)下 執(zhí)行create spfile from pfile; 并startup open
查詢數(shù)據(jù)庫自啟動以來最大的并發(fā)數(shù)量
修改最大連接數(shù):
alter system set processes = scope = spfile;
重啟數(shù)據(jù)庫:
shutdown immediate;
startup;
查看當前有哪些用戶正在使用數(shù)據(jù)
SELECT osuser a username cpu_time/executions/ || s sql_fulltext machine
from v$session a v$sqlarea b
where a sql_address =b address order by cpu_time/executions desc;
有的時候我們需要調(diào)整oracle數(shù)據(jù)庫的最大鏈接數(shù) 而這個鏈接數(shù)的調(diào)整是在oacle下的dbs目錄下init ora文件中調(diào)整的
ORACLE的連接數(shù)(sessions)與其參數(shù)文件中的進程數(shù)(process)有關(guān) 它們的關(guān)系如下
sessions=( *process+ )
但是我們增加process數(shù)時 往往數(shù)據(jù)庫不能啟動了 這因為我們還漏調(diào)了一個unix系統(tǒng)參數(shù) 它是核心參數(shù)中的semmns 這是unix系統(tǒng)的信號量參數(shù) 每個process會占用一個信號量 semmns調(diào)整后 需要重新啟動unix操作系統(tǒng) 參數(shù)才能生效 不過它的大小會受制于硬件的內(nèi)存或ORACLE SGA 范圍可從 —— 不等
但是 Processes的修改不僅應該調(diào)整initsid ora文件中的參數(shù) 而且應該調(diào)整OS的內(nèi)核參數(shù) 象AIX HPUX Solaris SCO UNIXWare都是這樣 OS的調(diào)整是需要重新啟動的 而且這個參數(shù)的設(shè)置不能簡單按照多少個終端要連到這個服務(wù)器上而定 最關(guān)鍵是考慮會有多少同時連上的session(在使用一些共享連接的中間件時 一般就不需要太大) 當然還要考慮一些Oracle的后臺進程 還有一些系統(tǒng)維護工作需要多一些連接等
我的atmp大前置機器上對oracle調(diào)整的時候 其使用的是unixware操作系統(tǒng) 在做鏈接數(shù)調(diào)整的時候 要先對核心參數(shù)進行調(diào)整
核心主要相關(guān)的參數(shù)的調(diào)整如下
SHMMAX???
SHMMIN???
SHMMNI???
SHMSEG???
SEMMNI???
SEMMSL???
SEMMNS???
SEMOPM???
其中semmni semmns semmsl要加大 至少要比processes大
SEMMNI( ) 指定在核心中信號識別的數(shù)量 這是可以在任意給定時間被激活的唯一信號設(shè)置數(shù)量 缺省值是 最大值由系統(tǒng)自動調(diào)整產(chǎn)生
SEMMSL( ) 指定每個信號識別中信號量的最大值 缺省值是
SEMMNS 除最大db外的所有db 的PROCESSES之和+ *最大db的PROCESSES+ *
實例數(shù) 如 個實例進程數(shù)分別為 則=( + )+ * + * =
tyle= LINE HEIGHT: %; FONT FAMILY: 宋體 SEMOPM( ) 指定在每個系統(tǒng)調(diào)用semop中能夠被執(zhí)行的信號操作量的最大值 缺省值是
SHMMAX( ) 指定了共享內(nèi)存部分大小的最大值 等于
× 物理內(nèi)存字節(jié)數(shù)
SHMMNI( ) 指定了系統(tǒng)范圍內(nèi)共享內(nèi)存標識的最大值
SHMSEG( ) 指定了與每個進程相關(guān)連的共享內(nèi)存塊(或標識)的數(shù)量 缺省值是 與每個進程相關(guān)連的共享內(nèi)存塊的最大值與進程擁有的未使用空間有關(guān) 因此 盡管一個進程擁有少于SHMSEG數(shù)值的共享內(nèi)存塊 它也有可能因為其有限的空間而不能與其它進程相聯(lián)系
init ora中調(diào)整為
processes = ?????????????????????????????????????????? # SMALL
#processes = ??????????????????????????????????????????? # MEDIUM
# processes = ??????????????????????????????????????????? # LARGE
From:! FE F A F! entry
修改oracle 的最大連接數(shù)
使用sys 以sysdba權(quán)限登錄
c: sqlplus /nolog
SQLconn / as sysdba
SQL show parameter processes;
NAME TYPE VALUE
aq_tm_processes integer
db_writer_processes integer
job_queue_processes integer
log_archive_max_processes integer
processes integer
SQL alter system set processes= scope = spfile;
系統(tǒng)已更改
SQL show parameter processes;
NAME TYPE VALUE
aq_tm_processes integer
db_writer_processes integer
job_queue_processes integer
log_archive_max_processes integer
processes integer
SQL create pfile from spfile;
文件已創(chuàng)建
lishixinzhi/Article/program/Oracle/201311/18790
1.設(shè)立主鍵。根據(jù)唯一性數(shù)據(jù)庫自動判別。
2.笨的方法:建議采用信號量。
舉例如下:
create signal_flag (signal number(1));insert into signal_flag values(1);
在每次查詢表有無記錄前,加入語句
select signal from signal_flag where signal=1 for update;
select count(1) int var_cnt from tab1 ;
if var_cnt =0 then insert.....
endif;
commit;