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提供的對數據庫事務操作的支持是比較完整的,通過事務操作可以提高程序的運行效率,保持數據的一致性。