java超时导致oracle锁表_java – 正确的设计,以避免Oracle死锁?
避免死鎖的通常建議是始終以相同的順序鎖定資源.但是,對于高度滿足的Oracle數據庫中的行鎖,您將如何實現這一點?
要了解我的意思,請考慮以下示例.一個非常簡單的DAO來處理銀行賬戶:
@Component
public class AccountDao {
@Resource
private DataSource dataSource;
public void withdraw(String account, int amount) {
modifyBalance(account, -amount);
}
public void deposit(String account, int amount) {
modifyBalance(account, amount);
}
private void modifyBalance(String account, int amount) {
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
PreparedStatement statement = connection
.prepareStatement("update account set balance = balance + ? where holder = ?");
statement.setInt(1, amount);
statement.setString(2, account);
statement.execute();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
要在兩個帳戶之間執行傳輸,有一種具有傳輸方法的InternalBankTransfer類:
public void transfer(String from, String to, int amount) {
// start transaction
accountDao.withDraw(from, amount);
accountDao.deposit(to, amount);
// commit transaction
}
通常這很好.但是,假設我們有兩個人同時啟動轉賬.讓我們說安妮想要在鮑勃想要將50轉移到安妮的同時向鮑勃轉移100美元.因此在一個線程中,Anne調用transfer(“Anne”,“Bob”,100),而另一個Bob調用transfer(“Bob”,“Anne”,50).如果執行順序如下,則此代碼容易受到死鎖的影響:
T1: accountDao.withDraw("Anne", 100);
T2: accountDao.withDraw("Bob", 50);
T1: accountDao.deposit("Bob", 100);
T2: accountDao.deposit("Anne", 50); // BAM! ORA-00060: deadlock detected while waiting for resource
我承認在我開始在實際應用程序中看到死鎖之前我根本沒有考慮過這個問題.我天真的看法是事務隔離類型自動處理這個問題.甲骨文表示,這是由于應用程序設計不佳造成的.但在這種情況下,什么是好的設計呢?我是否需要選擇更新我計劃更新的所有內容?如果這是涉及更新多個表的巨大事務怎么辦?我應該設計使死鎖不可能或只是最小化它們并接受they are a fact of life?
總結
以上是生活随笔為你收集整理的java超时导致oracle锁表_java – 正确的设计,以避免Oracle死锁?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java做台球时老是闪屏_电脑老是闪屏的
- 下一篇: java接收的文件转换成临时文件_And
