使用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();
}
}
}
就發現程序出錯,全部沒有插進去。