JDBC中的事务使用基本介绍:
1.JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务(每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而导致无法回滚)。
2.JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务(比如银行转账的那个问题)
3. 调用Connection的setAutoCommit(false);可以取消自动提交事务。
4.在所有的 SQL语句都成功执行后,调用Connection的commit();方法提交事务。
5. 在其中某个操作失败或出现异常时,调用Connection的rollback();方法回滚事务。
代码实现:
import com.JDBC.utils.JDBCUtils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Transaction {
@Test
public void Transaction() {
String sql1 = "update dog set name='songdog' where id =100";
String sql2 = "update dog set name = 'liudog' where id =200";
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JDBCUtils.getConnection();//默认情况下,connection是默认自动提交
//用connection对象设置事务不自动提交
connection.setAutoCommit(false);//在这里也表达出开启了事务
preparedStatement = connection.prepareStatement(sql1);
preparedStatement.executeUpdate();
int i =1/ 0;//设置一个异常让sql2无法执行
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
} catch (SQLException e) {
//如果在try中出现了异常,则会转到这里,意思便是这里可以回滚(即撤销执行的SQL)
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
finally {
JDBCUtils.close(null, connection, preparedStatement);
}
}
}
这个设置了异常让第二条语句无法执行,这样就进入了catch中
回归滚到事务开始事,导致sql1和sql2都未成功执行,保证了原子性
如果想要两条都执行,把那个int i = 1/ 0这个错误删掉就行