在Java中,我們可以使用行鎖和表鎖來保護多線程對數據庫的并發訪問。
行鎖是針對單一數據行的鎖定,可以將多個線程串行化地訪問同一數據行,以避免數據競爭和訪問沖突。Java中也提供了行級別的鎖定,如synchronized關鍵字就可以實現行級別的鎖定:
synchronized(obj){ //這里的代碼為被鎖定的行 }
當多個線程執行到這段代碼時,只有一個線程可以進入同步塊,并且在同步塊內的代碼執行完成之前,其他線程必須等待。
而表鎖是數據庫級別的鎖定,可以將整張表鎖定,以防止其他線程修改和查詢相關的數據。由于表級別的鎖定粒度更大,因此表鎖的效率相對行鎖要低一些。
//鎖定整張表 LOCK TABLES table_name WRITE; //解鎖表 UNLOCK TABLES;
需要注意的是,表鎖只有在極端情況下才應該使用,因為它會阻止其他線程對該表的一切操作,如果使用不當,可能會導致整個系統的崩潰。因此,表鎖應該盡可能避免使用,除非確實有必要。