commit和rollback是數據庫事務(wù)的兩個(gè)概念。
一個(gè)數據庫事務(wù)有開(kāi)始和結束邊界(boundary), 位于boundary的對數據庫的各種操作認為是對該事務(wù)的操作。
一個(gè)事務(wù)的要占用數據庫的一些資源,比如可能獲得數據庫的某個(gè)表的某條記錄的lock,如果一個(gè)事務(wù)長(cháng)期占用資源而不去釋放,那么對其他的事務(wù)是不利的,可能會(huì )使得速度很慢。
所以對數據庫操作的正確做法是讓事務(wù)短小,只做一些應該在事務(wù)里邊做的事情,以最快的速度讓一個(gè)事務(wù)結束,從而釋放該事務(wù)所占有的資源。
如何讓一個(gè)事務(wù)結束?commit或者rollback。兩者選其一,而且必選其一,才能夠確保一個(gè)事務(wù)被可靠的,安全的終止。commit意味著(zhù)對事務(wù)中的操作確定,rollback意味著(zhù)對事務(wù)中的操作否定。
JDBC中如何正確的處理事務(wù)?
1。如果需要保持一些操作的原子性,比如轉帳就需要原子性,那么必須要將這些操作放在一個(gè)事務(wù)中。
- boolean success = false;
- try
- {
- conn.setAutoCommit(false);
-
- conn.commit();
- success = true;
- }
- catch(SQLException e)
- {
- conn.rollback();
- success = false;
- }
- if(success)
-
2。如果不需要處理原子性的操作,比如查詢(xún) (SELECT),那么只需要conn.setAutoCommit(true);做就可以了。
也可以這樣, 其實(shí)都一樣的.
- java.sql.Connection conn = null;
- try {
-
-
-
- conn = dataSource.getConnection();
- System.out.println("jdbc connection init");
-
-
- conn.setAutoCommit(false);
-
-
- java.sql.Statement st = conn.createStatement();
- sql = "DELETE FROM user where userId=1";
- st.execute(sql);
-
-
- conn.commit();
- }catch(Exception e) {
- if (conn != null) {
- try {
-
- conn.rollback();
- conn.commit();
- }catch(Exception ex) {
- System.out.println("MySQL Rollback Fail: " + e.getMessage());
- }
- }
- System.out.println("Delete Fail: " + e.getMessage());
- }
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。