jdbc如何鎖定某一條數據或者表,不讓別人操作?


jdbc如何鎖定某一條數據或者表,不讓別人操作?

只有並發的時候才會有死鎖,你要把多個涉及到這個表的地方檢查一下,排除死鎖可能。

為了避免修改沖突,所以我要鎖定。
請問該如何實現
答:
例如:select * from t_user for update;
 
追問
如何解鎖?
追答
當你事物提交后就能夠解鎖了。比如pstmt.executeUpdate();自動就解鎖了
就是在sql語句后面加“for update”,就加鎖了。

1.數據庫默認事務是自動提交的,也就是發一條sql它就執行一條。如果想多條sql放在一個事務中執行,則需要使用如下語句。
2.

JDBC API支持事務對數據庫的加鎖,並且提供了5種操作支持,2種加鎖密度。

5種加鎖支持為:

static int TRANSACTION_NONE = 0;

static int TRANSACTION_READ_UNCOMMITTED = 1;

static int TRANSACTION_READ_COMMITTED = 2;

static int TRANSACTION_REPEATABLE_READ = 4;

static int TRANSACTION_SERIALIZABLE = 8;

具體的說明見表4-2。

2種加鎖密度:

最后一項為表加鎖,其余3~4項為行加鎖。

JDBC根據數據庫提供的默認值來設置事務支持及其加鎖,當然,也可以手工設置:

setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);

可以查看數據庫的當前設置:

getTransactionIsolation ()

需要注意的是,在進行手動設置時,數據庫及其驅動程序必須得支持相應的事務操作操作才行。

上述設置隨着值的增加,其事務的獨立性增加,更能有效地防止事務操作之間的沖突,同時也增加了加鎖的開銷,降低了用戶之間訪問數據庫的並發性,程序的運行效率也會隨之降低。因此得平衡程序運行效率和數據一致性之間的沖突。一般來說,對於只涉及到數據庫的查詢操作時,可以采用TRANSACTION_READ_UNCOMMITTED方式;對於數據查詢遠多於更新的操作,可以采用TRANSACTION_READ_COMMITTED方式;對於更新操作較多的,可以采用TRANSACTION_REPEATABLE_READ;在數據一致性要求更高的場合再考慮最后一項,由於涉及到表加鎖,因此會對程序運行效率產生較大的影響。

另外,在Oracle中數據庫驅動對事務處理的默認值是TRANSACTION_NONE,即不支持事務操作,所以需要在程序中手動進行設置。總之,JDBC提供的對數據庫事務操作的支持是比較完整的,通過事務操作可以提高程序的運行效率,保持數據的一致性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM