服務端和android客服端回滾

使用事務操作SQLite數據庫

使用SQLiteDatabase的beginTransaction()方法可以開啓一個事務,程序執行到endTransaction() 方法時會檢查事務的標誌是否爲成功,如果程序執行到endTransaction()之前調用了setTransactionSuccessful() 方法設置事務的標誌爲成功則提交事務,如果沒有調用setTransactionSuccessful() 方法則回滾事務。使用例子如下: SQLiteDatabase db = ....;
db.beginTransaction();//開始事務
try {
    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"王昌龍", 4});
    db.execSQL("update person set name=? where personid=?", new Object[]{"昌龍", 1});
    db.setTransactionSuccessful();//調用此方法會在執行到endTransaction() 時提交當前事務,如果不調用此方法會回滾事務
} finally {
    db.endTransaction();//由事務的標誌決定是提交事務,還是回滾事務

db.close(); 
上面兩條SQL語句在同一個事務執行。



服務端的jdbc:

完善代碼:
package com.redking.jdbc.demo;   
import java.sql.Connection;   
import java.sql.DriverManager;   
import java.sql.SQLException;   
import java.sql.Statement;   
public class JDBCDemo07 {   
        public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;   
        public static final String DBURL = "jdbc:odbc:testDB" ;   
        public static void main(String[] args) {   
                Connection conn = null ;   
                Statement pstmt = null ;   
                try {   
                        // 向JAVA容器中加載驅動   
                        Class.forName(DBDRIVER) ;   
                } catch (ClassNotFoundException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        conn = DriverManager.getConnection(DBURL) ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        pstmt = conn.createStatement() ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                //取消自動提交   
                try {   
                        conn.setAutoCommit(false);   
                } catch (SQLException e1) {   
                        // TODO Auto-generated catch block   
                        e1.printStackTrace();   
                }   
                //現在執行數據庫的更新操作   
                try {   
                        pstmt.executeBatch() ;   
                        //如果沒有錯誤,則表示可以向下執行   
                        //手工提交   
                        conn.commit();   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                        //如果出錯了,則應該把數據回滾   
                        try {   
                                conn.rollback();   
                        } catch (SQLException e1) {   
                                // TODO Auto-generated catch block   
                                e1.printStackTrace();   
                        }   
                }   
                try {   
                        pstmt.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
                try {   
                        conn.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
        }   
}

就發現程序出錯,全部沒有插進去。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章