概述
先来解释一下什么叫做事务。
事务:一个事件的完成需要好几个步骤完成后才算这个事情真正的完成。例如,你用支付宝给别人转上一笔钱,其操作的完成是,你给他转一笔钱后,1.你的支付上面显示少了500,2.然后他的支付宝上显示多了500,此时这个事件才算完成。而转钱就是一个事务,其中的1和2是它的两个步骤。假如其中有那个显示未更新就会出现错误,那么如何避免????
接下里我们就看一下事务如何操作。
首先我们要了解的是在我们利用JAVA代码去获取连接数据库对象,然后获取sql命令对象,去执行sql命令,其中对于增删改对其操作是执行后默认直接提交的,而在oracle数据库第三方插件的界面操作上是会给反悔的机会,也就是说你可以将数据恢复到原来没有改变之前。
体会一下oracle PL/SQL界面的回滚:
现在执行 update student set age = 15 where sno=2 的sql语句
按下回滚按钮后,再去查询此表:
在JAVA代码操控数据库,也有方法去提供这样的机制,用来解决事务问题,如果几个步骤都成功就统一改变数据库的数据,没有就回滚,恢复到前面的数据的。
其利用的是一组方法:
setAutoCommit():是在获取数据库连接对象后,将其执为手动提交。
rollback():执行未成功就回滚。
commit():执行成功后进行手动提交。
接下里编一个小例子:
先在oracle里面建立一个表:
package cn.liu.jbdc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC的事务管理:
* 转账业务
* 示例:
* 小王给小明转账1000元.
*
*/
public class Demo_RoolBack {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String driverPackage = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin://@DESKTOP-F4QSNQL:1521/XE";
String user = "scott";
String password = "qwer";
//4.创建sql命令(小王给小明转1000元)
String sql1 = "update AA set 余额=余额-1000 where 编号=1";//小王减少1000元
String sql2 = "update AA set 余额=余额+1000 where 编号=8";//小明增加1000元
//1.加载驱动包
Class.forName(driverPackage);
//2.获取数据库连接对象
Connection conn = DriverManager.getConnection(url,user ,password);
//conn.setAutoCommit(false);//设置手动提交
//3.连接sql命令对象
Statement state = conn.createStatement();
//5.执行sql命令
int i = state.executeUpdate(sql1);
int j = state.executeUpdate(sql2);
System.out.println(i+"------"+j);
/*
if(i>0&&j>0) {
conn.commit();
}else {
conn.rollback();
}
*/
//6.关闭相关资源
state.close();
conn.close();
}
}
显然可以看到sql语句一条是正确的,一条错误的,如果没有回滚的事务管理的话,应该一条执行,一条出错。
我们执行后看效果:
现在执行正确的sql语句(只是sql语句改变了,其他得没有变):
package cn.liu.jbdc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo_RoolBack {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String driverPackage = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin://@DESKTOP-F4QSNQL:1521/XE";
String user = "scott";
String password = "qwer";
//4.创建sql命令(小王给小明转1000元)
String sql1 = "update AA set 余额=余额-1000 where 编号=1";//小王减少1000元
String sql2 = "update AA set 余额=余额+1000 where 编号=2";//小明增加1000元
//1.加载驱动包
Class.forName(driverPackage);
//2.获取数据库连接对象
Connection conn = DriverManager.getConnection(url,user ,password);
conn.setAutoCommit(false);//设置手动提交
//3.连接sql命令对象
Statement state = conn.createStatement();
//5.执行sql命令
int i = state.executeUpdate(sql1);
int j = state.executeUpdate(sql2);
System.out.println(i+"------"+j);
if(i>0&&j>0) {
conn.commit();
}else {
conn.rollback();
}
//6.关闭相关资源
state.close();
conn.close();
}
}
此时oracle此表的数据:
所以,以后有增删改的时候,最好加上事务管理。
最后
以上就是沉默帅哥为你收集整理的JDBC事务的回滚(rollback方法和setAutoCommit方法的使用)的全部内容,希望文章能够帮你解决JDBC事务的回滚(rollback方法和setAutoCommit方法的使用)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复