30 jdbc事务设置

什么是事务

在plsql中,我们在执行增删改后,并不会马上写到表中,而是要手动点击一下提交按钮提交按钮(f10),如果不想提交刚才执行的代码,则可以点击回滚按钮(shift+f10)。

提交和回滚在plsql中如图:

 

 

 

jdbc事务的用途

在后台项目中,如果没有设置自动提交,则默认为自动提交true。这会导致一个问题:数据的不安全。

举个例子,在eclipse中我们写了jdbc连接后却没设置自动提交,代码为从A的账户中向B转1000元,程序在运行中,从A中扣款的代码执行成功了,但向B中添加1000元的代码却抛了异常。

我们查询表发现,A的账户的确少了1000元,但B的账户却没有增加。

jdbc设置事务

第一步:在连接数据库对象创建后使用它调用setAutoCommit(false)方法传入false

第二步:在执行SQL语句的try-catch代码块的try中,SQL语句的代码后添加:conn.commit();//conn为数据库连接对象。在没有SQL语句报异常的情况下正常执行

第三步,在执行SQL语句的try-catch代码块的catch(SQLException e)中,添加:conn.rollback();它表示如果SQL执行语句报异常,则回滚,执行结果不写入表中。

commit()方法就相当于提交按钮,而rollback()方法就相当于回滚按钮。

完整如下例子:

try {
			//1.加载驱动类
			Class.forName(driver);
			//2.连接指定的数据库对象
			conn = DriverManager.getConnection(url,username,password);
			//3.设置自动提交设置为false
			conn.setAutoCommit(false);
			//3.获取sql命令对象
			stmt = conn.createStatement();
			//4.创建SQL命令
			String sql = "insert into dept values(80,'吃鸡学院','北京')";
			String sql2 = "select * from emp";
			//5.执行SQL命令
			int i = stmt.executeUpdate(sql2);//返回-1表示失败,返回其它数表示成功执行的条数。
			System.out.println("执行结果:"+i);
			conn.commit();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch(SQLException e){
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally {
			//6.关闭流
			try {
				if(stmt!=null) {
					stmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

  

posted @ 2020-02-15 17:37  Scorpicat  阅读(205)  评论(0编辑  收藏  举报