使用JDBC连接ORACLE,初级的演示事务执行。
JDBC事务定义级别分为五类:
TRANSACTION_NONE:
TRANSACTION_READ_UNCOMMITED:
TRANSACTION_READ_COMMITED: 能够防止脏读,比如防止读到其他session没有提交的信息。
TRANSACTION_REPEATABLE_READ:能够防止前后读不一样,第一次读完,其他session执行DML操作,第二次读的就会和第二次不一样。可以加上select for update限制
TRANSACTION_SERIALIABLE:
下面用例子简单说明怎么处理事务:因为只是做事务,所以连接都写在主函数中了。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* transaction demo
* @author oracle
* @since 2012-08-14
*/
public class ConnectionUtils {
public static void main(String [] args) throws SQLException{
Connection connection = null;
Statement statement = null;
try{
//get connection
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.102:1521:ora1","sunlei","sunlei");
connection.setAutoCommit(false);
statement = connection.createStatement();
statement.execute("insert into users values(3,'c')");
statement.execute("insert into users values(2,2,3)");
connection.commit();
System.out.println("execute successs");
connection.setAutoCommit(true);
}catch(Exception e){
System.out.println("exception rollback");
connection.rollback();
}finally{
statement.close();
connection.close();
}
}
}
首先得到jdbc连接,然后设置非自动提交(因为JDBC默认为自动提交事务,每条sql语句被看做一个事务,所以如果这条sql执行成功则系统自动调用commit,如果不成功则自动调用rollback),我们通过设置connection.setAutoCommit(false)来阻止自动提交,这样就能把多条sql拼成一个事务。在这个例子中,如果两条sql语句都执行成功则调用commit。我的users表中只有两个字段,id和username,所以第二条插入sql会有异常,第二条sql语句执行完肯定会跳到catch块,执行rollback操作,这样就把第一条sql回滚了,所以第二条出错,这两条sql全部不提交。最后在finally块中关闭connection