2010-12-07 16 views
1

我有一個使用myBatis進行持久化的項目。下面的方法「A」工作得很好,直到我添加了一些外鍵,並將我的表從myISAM轉換爲innoDB。轉換後,方法「A」會靜默失敗,甚至不會在日誌中發出警告。轉換後,只有方法「B」成功插入。這兩種方法都將正確的sql寫入日誌,但只有「B」纔有效。爲什麼myBatis插入/更新功能現在需要在將FK添加到數據庫之後進行提交?

任何人都可以填寫我爲什麼我需要現在做一個提交,但不必以前做過提交?

//doesnt work, but worked previously 
public void A(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

//works correctly, but why? 
public void B(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
     session.commit(); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

回答

10

myISAM不是事務性的。自動提交默認打開(實際上,自從每個語句都提交後,JDBC驅動程序將忽略它)。 innoDB是事務性的,autocommit默認也是關閉的。這意味着你必須調用session.commit()或DB實際上沒有更新。

查看this blog entry瞭解更多信息。

請注意,您應該調用commit,而不是讓事情自動落實。關閉自動提交會導致連接池問題,因爲當連接重用時,它可能會使語句處於未知狀態。

+0

我沒有意識到myisam和innodb之間的交易差異,這要歸功於那個小珍聞。 – clarson 2010-12-07 03:11:54

相關問題