JSP Web开发入门系列(二)---JDBC事务管理

    数据库的事务管理核心是: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();

}
}

}

 

 

    只有在事务提交之后,数据库才会保存修改数据。在catch块中,使用了回滚方法,如果SQL语句出错的话,将会抛出异常,程序执行回滚任务。数据库将不会更改。

 

posted @ 2010-11-01 21:03  林场  阅读(611)  评论(0编辑  收藏  举报
知识共享许可协议
本作品由VentLam创作,采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。