数据库的事务管理核心是:ACID。本文主要涉及的是其中的原子性(Atomic)。原子性,遵循“All or Nothing”原则。简单地来说就是将任意多个SQL语句看作一个整体,只有所有的这些SQL全部成功执行了,DBMS才会保存对数据库的修改,称之为事务提交;否则,数据库恢复到SQL语句执行前的状态,称之为事务回滚。不同数据库有不同版本的回滚版本。
JDBC下有两种事务模式分别为隐式和显式模式。前者是JDBC下默认开启的,不必通过事务提交,直接将修改的数据保存在数据库中。后者使用setAutoCommit 方法来将隐式转换成显式模式,手工提交事务,即是说显示模式需要使用commit方法提交后,对数据库的修改才生效。 setAutoCommit方法定义如下:
void setAutoCommit(boolean autoCommit) throws SQLEXception;
以下的代码是使用PreparedStament对象执行的动态SQL来对数据库进行事务管理。主要是向数据库中pet表增加一条记录。
代码
package JDBCTest;
import java.sql.*;
publicclass Transaction {
/**
* @param args
* @author viki
* 事务提交与回滚
*/
publicstaticvoid main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class.forName("com.mysql.jdbc.Driver");
String serverName, dbName,userName,passWord;
serverName ="localhost";
dbName="viki";
userName="root";
passWord="123";
String url ="jdbc:mysql://"+serverName+"/"+dbName+"?characterEncoding=UTF8";
Connection conn=DriverManager.getConnection(url,userName,passWord);
try
{
// 开始事务
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
System.out.println("Update the record:"+ stmt.executeUpdate("UPDATE pet SET sex ='m'"));
stmt.close();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO pet (name,owner,species) VALUES (?,?,?)");
pstmt.setString(1,"dave");
pstmt.setString(2, "viki");
pstmt.setString(3, "pig");
System.out.println("Update the record:"+pstmt.executeUpdate());
pstmt.close();
//提交事务
conn.commit();
}
catch (Exception e) {
// TODO: handle exception
// 事务回滚
conn.rollback();
}
}
}
import java.sql.*;
publicclass Transaction {
/**
* @param args
* @author viki
* 事务提交与回滚
*/
publicstaticvoid main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class.forName("com.mysql.jdbc.Driver");
String serverName, dbName,userName,passWord;
serverName ="localhost";
dbName="viki";
userName="root";
passWord="123";
String url ="jdbc:mysql://"+serverName+"/"+dbName+"?characterEncoding=UTF8";
Connection conn=DriverManager.getConnection(url,userName,passWord);
try
{
// 开始事务
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
System.out.println("Update the record:"+ stmt.executeUpdate("UPDATE pet SET sex ='m'"));
stmt.close();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO pet (name,owner,species) VALUES (?,?,?)");
pstmt.setString(1,"dave");
pstmt.setString(2, "viki");
pstmt.setString(3, "pig");
System.out.println("Update the record:"+pstmt.executeUpdate());
pstmt.close();
//提交事务
conn.commit();
}
catch (Exception e) {
// TODO: handle exception
// 事务回滚
conn.rollback();
}
}
}
只有在事务提交之后,数据库才会保存修改数据。在catch块中,使用了回滚方法,如果SQL语句出错的话,将会抛出异常,程序执行回滚任务。数据库将不会更改。