事務中的一些問題

2021-08-30 05:38:52 字數 1894 閱讀 7624

[size=medium]近期遇到了不少併發和事務問題,總結如下

[color=green]1.鎖 必須在取資料之前。 現在的事務主要是通過鎖資料並通過在後面的校驗中驗證狀態實現的,

要注意,後面的驗證資料一定要是加鎖之後取出來的資料,比如驗證訂單狀態能否進行當前操作時

要重新取一下訂單。

2.鎖的粒度

原則:粒度越小越好,但同時也要在不影響效能的情況下,考慮實現的方便和**的結構性。

舉例: 當僅僅時對訂單進行操作時,不要鎖住客戶,但是由於下單時沒有訂單,這種情況下就要鎖客戶,續訂和續訂的修改是公用的方法,這樣在這方法中就要判斷什麼時候要鎖客戶,什麼時候要鎖訂單,導致多餘的判斷,**結構不好。這個時候考慮所有訂單操作都鎖住客戶表。

軍哥原來提出過乙個方法,就是專門提供乙個表用來加鎖,這中方法可以完全避免死鎖的問題

不失為一種好的方法。

3.orcle 具有隱含鎖,有些操作不需要加鎖

oracle鎖的型別在正常情況下,oracle會自動鎖住需要加鎖的資源以保護資料,這種鎖是隱含的,叫隱含鎖。下面指明了會產生隱含鎖的sql語句:

insert;update;delete;

4.同乙個事務中可以加兩次或兩次以上的鎖。

5.在事務外面加鎖不起作用,加鎖的forupdate 作為一條普通select 語句執行,下乙個執行緒不會在鎖的位置等待。

6.一些用於查詢鎖的sql,

應用場景,由於在測試併發時會經常用到一些鎖表的問題。需要找出被什麼人鎖住,是在程式中鎖住,還是在pl/sql

中鎖住。

可以用如下的sql 配合查詢。

(1) 在boss 的查詢,後面的是王英傑提供的查詢。但是dmp的這幾個系統表的許可權沒有開給我們。

select object_type,object_name,owner from dba_objects where object_id in (

select object_id from v$locked_object);

select * from v$session where username in ('fbackoffice') order by status;

(2) select c.sid,

c.serial#,

c.terminal || '-' || c.osuser || '-' || module || ' hold ' ||

do.object_type || ' ' || do.object_name xx

from v$lock a, v$lock b, v$session c, dba_objects do

where b.type = 'tx'

and a.sid = b.sid

and c.sid = a.sid

and do.data_object_id = a.id1;

搜尋結果如下:

1 202 22204 alibaba-11823-zhaobo.dingzhb-pl/sql developer hold table crm_customer

分析下: lock 表 存當前所有的鎖的情況,session 是當前訪問資料庫所有的使用者session ,dba_objects 存放了所有表的資訊,每個表作為一條記錄,通過關聯這三張表就可以搜尋出所有的鎖住表的記錄

lock 的type 有 tx tm 等 tx是記錄鎖,tm是表鎖,由於鎖表也是線鎖表再鎖記錄,這樣通過

限定b.type = 'tx'所有的鎖都是能查詢到的

至於搜尋出的記錄集比較容易看清楚:

c.terminal 終端機: 你的機器名

c.osuser :你的使用者

do.object_type :終端所用的工具,即你的pl/sql或者程式。

do.object_name :被鎖的表名稱

[/color]

[/size]

繼承中的一些問題

1.本質 達到 復用,子類可以復用父類的方法和屬性 2.繼承關係中構造方法的呼叫關係 子類的任何乙個構造方法,總是會呼叫父類中的某乙個構造方法 預設情況下,呼叫父類無參構造方法 可以使用super關鍵字,在子類構造方法中的第一行呼叫 父類指定的構造方法 3.方法覆蓋 重寫 覆蓋了父類的方法 要求 同...

Word中的一些問題

在做畢業 時,有一些人在用word的分隔符時常常遇到問題,在這裡我給大家說一下,用分隔符的目的是為了區分各個部分頁面的不同而出現的。有分隔符和分欄符之分。如果你大學還沒有畢業,還沒有開始寫畢業 那麼這個你一定要學會,因為畢業 是有他自己的格式的,老師會要求你用那種頁首 那種頁尾 那種頁碼,要求是很嚴...

String 一些問題

前言 等號 對於基本型別,比較的是值,對於引用型別,比較的是記憶體位址。1.在物件池中建立,如果常量池中已經存在則返回常量池中已經有的。private static void test1 結果 true 2.乙個在string pool中,乙個在堆中。private static void test...