最經典的解釋事務處理的例子應該是關於銀行轉賬的問題:
張三給李四轉錢,張三把錢轉給李四的同時,李四的賬號上面應該增加對應的金額,但是如果在這期間,突然發生意外情況,例如斷電死機等,使得張三的錢被扣掉了,但是對應的李四賬戶上面卻沒有增加對應的金額。這樣就是不安全的轉賬,而且是誰也不願意的。而我們利用事務處理就可以避免這種情況。事務處理的好處就是,所執行的語句要麼同時處理,要麼同時不處理。
事務處理是一種機制,用來管理必須成批執行的MySQL操作,以保證數據庫不包含不完整的操作結果。利用事務處理,可以保證一組操作不會中途停止,他們或者作爲整體執行,或者完全不執行(除非明確指示)。如果沒有錯誤發生,整組語句提交到數據庫表,如果發生錯誤,則進行回退,以恢復數據庫到某個已知且安全的狀態。
java運用事務處理時,首先要修改默認的自動提交,我們將提交方式更改爲手動的提交,這樣的話,我們才能將一批要處理的語句放在一個事務裏面進行同時處理或者不處理。然後再進行手動提交,在事務處理完成之後,一定要記得恢復現場,將提交設置爲默認的自動提交。這樣的話,當catch到任何的sqlexception的情況下,進行事務回滾。。然後回退到一個安全的狀態。
public class JdbcTransaction {
public static void main(String[] args){
Connection conn =null;
Statement stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver"); //建立驅動
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/studemo","root","root");//建立連接
stmt = conn.createStatement();//創建語句
conn.setAutoCommit(false); // 設置不自動提交
stmt = conn.createStatement();
stmt.addBatch("insert into stu values (25,'zhangsan','1234')");
stmt.addBatch("insert into stu values (4,'zhangsan','1234')");
stmt.addBatch("insert into stu values (27,'zhangsan','1234')"); // sql語句爲任意的DML操作語言
stmt.executeBatch();
conn.commit(); // 進行事務手動提交
conn.setAutoCommit(true); // 還原現場
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
// e.printStackTrace(); 屏蔽這句話,不會控制檯提示報錯,但是事務在出錯的時候會進行回滾
try{
if(conn!=null){
conn.rollback(); // 當catch到任何的SQLException,進行事務回滾
conn.setAutoCommit(true);
// 可能會因爲某個sql語句出錯而無法執行上面的還原現場代碼,所以再次設置
}
}catch (SQLException e1) {
// TODO: handle exception
e1.printStackTrace();
}
}finally{
try{
if(stmt!=null){stmt.close();stmt=null;}
if(conn!=null){conn.close();conn=null;}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
解釋:上面的處理由於添加了事務,在執行插入第二句的時候進行了錯誤,但是由於添加了事務,所以回滾到以前,把第一句正常的也給回滾到以前而沒有插入到數據庫。這就是事務處理。如果在沒有事務處理的情況下,會將第一句插入到數據庫。
關於事務處理查看http://blog.csdn.net/sinat_28978689/article/details/56292044