JDBC--事务

一、为什么要用到事务?

为了防止批量插入时产生脏数据。在批量插入时,如果插入过程中途因某个sql语句错误而导致插入停止,那么在这之前插入的数据就是脏数据。这时,就需要用到事务处理,将批量插入的数据“打包”成一个整体,这样在进行插入操作时,只要有一个数据不正确,整体的数据就不会提交,有效防止了脏数据的产生。

二、事务如何使用?

把连续执行的一系列SQL语句(主要是DML语句)视为一个整体,这个整体指的是开启事务到结束事务的中间过程。

过程:

  1. 开启事务–取消自动提交con.setAutocommit(false)
  2. 提交事务–用commit主动提交事务来更新数据
  3. 回滚事务–使用rollback将数据回滚到事务开启时

代码:

package package1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestStudent {

	public static void main(String[] args) {
		//获取连接
		Connection con = JDBCutil.getConnection();
		
		PreparedStatement st = null;
		String sql1 = "update student set age=age+10 where name='张飞'";
		String sql2 = "update student set age=age+20 where name='张飞'";
		String sql3 = "update student set age=age+30 where name='张飞'";
		try {
			con.setAutoCommit(false);//取消自动提交--开启事务
			st=con.prepareStatement(sql1);
			st.executeUpdate();
			st=con.prepareStatement(sql2);
			st.executeUpdate();
			st=con.prepareStatement(sql3);
			st.executeUpdate();
			con.commit();//自动提交
			System.out.println("修改成功!");
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				con.rollback();//事务回滚 ,出错时会回滚到事务开启时
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			System.out.println("出现异常!");
		}		
	}
}

数据库数据:
在这里插入图片描述

2.1 正确操作时:

正常操作下(sql语句无错误),代码的执行及结果:
在这里插入图片描述
在这里插入图片描述

这时年龄是正确修改的。

2.2 错误操作时:

当有一条数据不正确时,比如下面的情况:

String sql2 = "update student set age1=age+20 where name='张飞'";

这时的运行结果如下:
在这里插入图片描述
在这里插入图片描述

此时数据库的数据时不变化的。即使正确执行的sql1也没有执行,有效防止了脏数据的产生。

2.3 (反例)脏数据产生的情况

代码(这是没有加事务回滚的哦 ):

package package1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestStudent {

	public static void main(String[] args) {
		//获取连接
		Connection con = JDBCutil.getConnection();
		
		PreparedStatement st = null;
		String sql1 = "update student set age=age+10 where name='张飞'";
		String sql2 = "update student set age1=age+20 where name='张飞'";//错误语句
		String sql3 = "update student set age=age+30 where name='张飞'";
		try {
			st=con.prepareStatement(sql1);
			st.executeUpdate();
			st=con.prepareStatement(sql2);
			st.executeUpdate();
			st=con.prepareStatement(sql3);
			st.executeUpdate();
			System.out.println("修改成功!");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("出现异常!");
		}		
	}
}

数据库:
在这里插入图片描述
执行结果:
在这里插入图片描述
在这里插入图片描述

虽然抛出了异常,但是sql1的却得到了执行,而sql2和sql3未能执行。注入的sql1就是“脏数据”,这个数据本不该出现却出现了,这在项目开发中是严令禁止的!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值