先来解释一下什么叫做事务。
事务:一个事件的完成需要好几个步骤完成后才算这个事情真正的完成。例如,你用支付宝给别人转上一笔钱,其操作的完成是,你给他转一笔钱后,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里面建立一个表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49package 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语句改变了,其他得没有变):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 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事务内容请搜索靠谱客的其他文章。
发表评论 取消回复