JDBC处理transaction

来源:互联网 发布:linux文档下载 编辑:程序博客网 时间:2024/05/02 01:31

1.   什么是Transaction?所谓Transaction是指一系列不可分割的改动数据库的操作。在这个解释中,有三个关键词:一系列不可分割以及改动。仅仅是一个改动数据库的操作是没有Transaction可言,只有一系列操作(一组SQL语句)才可能组成Transaction不可分割就意味着一致性和完整性,要么这一系列操作全部commit(操作顺利完成的情况),要么就全部rollback(操作在某处失败的情况,让数据库回到我们对它进行的这一系列操作之前的状态);如果一系列的操作只包含enquiry(查询)操作,那么这些操作也不是Transaction

2.   开发应用举例:银行转账,是不是要同时改变两个人的账户呢?

3.   J2EE中,Transaction主要有几大类,具体有几种?在J2EE中,Transaction主要有Bean-Managed TransactionContainer-Managed Transaction两大类。其中在Bean-Managed Transaction中还会分为JDBC TransactionJTA Transaction两种。

4.   什么是JDBC Transaction?它有怎样的特点?JDBC Transaction是指由Database本身去管理的事务。其最大的特点就是通过显示调用Connection接口的commitrollback方法来完成事务的提交和回滚。事务结束的边界是commit或者rollback方法的调用,而开始的边界则不是那么明显了,它会开始于组成当前事务的所有statement中的第一个被执行的时候。具体代码如下:

 

//什么是Transaction?所谓Transaction是指一系列不可分割的改动数据库的操作

//下面的程序演示了JDBC如何对transaction进行处理

import java.sql.*;

public class TransactionTest {

    public static void main(String[] args) {

       Connection conn = null;

       Statement stmt = null;

       try {

           Class.forName("oracle.jdbc.driver.OracleDriver");

           conn = DriverManager.getConnection("jdbc:oracle:thin:@198.168.0.1:1521:SXT","scott","tiger");

           //默认情况下后面的三条insert语句结果会逐个插入数据库表中并自动提交,而我们的目的是保证它们能够同时提交而不是逐个提交

           //第一步:把AutoCommit这一属性设置成false,不让它自动提交

           conn.setAutoCommit(false); //Connection中有setAutoCommit这一属性,我们可以为其设定不同的参数(true or false)来规定是否自动提交

           stmt = conn.createStatement();    

          

           stmt.addBatch("insert into dept values (1001,'game1','bj')");

           stmt.addBatch("insert into dept values (1002,'game2','bj')");

           stmt.addBatch("insert into dept values (1003,'game3','bj')");

          

           stmt.executeBatch();

           //既然我们没有使用默认的自动提交,那么就需要我们自己完成提交

           conn.commit();

           //提交完后在恢复默认

           conn.setAutoCommit(true);

       }

       catch(ClassNotFoundException e) {

           e.printStackTrace();

       }

       //catch到任何的SQLException,代表操作失败,那么记得必须在出现异常后要rollback,否则数据库可能被破坏

       catch(SQLException e) {

           e.printStackTrace();

           try {

              if(conn != null) {

                  conn.rollback();

                  //既然出现了异常,就更加不要忘了恢复默认

                  conn.setAutoCommit(true);

              }

           }

           catch(SQLException e2) {

               e.printStackTrace();

           }

       }

       finally {

           try {

              if(stmt != null) {

                  stmt.close();

                  stmt = null;

              }

              if(conn != null) {

                  conn.close();

                  conn = null ;

              }

           }

           catch(SQLException e) {

              e.printStackTrace();

           }

       }

    }

}

0 0
原创粉丝点击