import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
public class TransactionDemo {
//JDBC显示操作事务的API
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Savepoint sp = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb2?user=root&password=123456";
conn = DriverManager.getConnection(url);
String sqla = "update user set salary = 11111 where id = 32";
String sqlb = "update user set salary = 22222 where id = 32";
//设置事务显示手工提交
conn.setAutoCommit(false);
//sqla
pstmt = conn.prepareStatement(sqla);
pstmt.executeUpdate();
//设置一个回滚点
sp = conn.setSavepoint();
int a = 10/0;//设置出错
//sqlb
pstmt = conn.prepareStatement(sqlb);
pstmt.executeUpdate();
//设置事务手工提交
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
//事务回滚,默认情况下,回滚到事务开始之前的状态
conn.rollback(sp);
conn.commit();
} catch (SQLException e1) {
//e1.printStackTrace();
}
}finally{
try {
if(rs!=null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(pstmt!=null)
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行。可使用下列语句:
JDBC控制事务语句
•Connection.setAutoCommit(false);
•Connection.rollback();
•Connection.commit();