我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JDBC系列:(7)使用Connection操作事务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JDBC系列:(7)使用Connection操作事务

事务ACID特性
序号特性描述
1原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响




Connection操作事务的相关方法
序号方法作用
1void setAutoCommit(boolean autoCommit)设置事务是否自动提交
如果设置为false,表示手动提交事务。
2void commit() ()手动提交事务
3void rollback()回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
4Savepoint setSavepoint(String name)在当前事务中创建一个保存点


1、使用事务

package com.rk.db.g_transaction;

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

import com.rk.db.utils.JDBCUtil;


public class Demo01
{
	public static void main(String[] args)
	{
		Connection conn = null;
		try
		{
			conn = JDBCUtil.getConnection();
			// 1、设置事务为手动提交
			conn.setAutoCommit(false);

			boolean flag = true; //表示是否出现SQL异常
			transferMoney(conn, 100, "张三", "李四",flag);
		}
		catch (SQLException e)
		{
			System.out.println("转账失败!");
			try
			{
				// 2、 出现异常,需要回滚事务
				conn.rollback();
				System.out.println("回滚操作成功!!!");
			}
			catch (SQLException ex)
			{
				ex.printStackTrace();
			}
		}
		finally
		{
			// 3、所有的操作执行成功, 提交事务
			try
			{
				conn.commit();
				System.out.println("执行完毕!");
			}
			catch (SQLException e)
			{
				e.printStackTrace();
			}
			JDBCUtil.closeQuietly(conn);
		}
	}

	
	private static void transferMoney(Connection conn, 
			long moneyNum, String userAdd, String userSub,
			boolean flag) throws SQLException
	{
		PreparedStatement pstmtAdd = null;
		PreparedStatement pstmtSub = null;

		try
		{
			String sqlAddMoney = "update T_Bank set money=money+? where username=?";
			pstmtAdd = conn.prepareStatement(sqlAddMoney);
			pstmtAdd.setLong(1, moneyNum);
			pstmtAdd.setString(2, userAdd);
			pstmtAdd.executeUpdate();
			
			if(flag)
			{
				throw new SQLException("模拟SQL执行出错");
			}

			String sqlSubMoney = "update T_Bank set money=money-? where username=?";
			pstmtSub = conn.prepareStatement(sqlSubMoney);
			pstmtSub.setLong(1, moneyNum);
			pstmtSub.setString(2, userSub);
			pstmtSub.executeUpdate();
		}
		finally
		{
			JDBCUtil.closeQuietly(pstmtAdd);
			JDBCUtil.closeQuietly(pstmtSub);
		}

	}
}



2、使用事务,回滚到指定的代码段

package com.rk.db.g_transaction;

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

import com.rk.db.utils.JDBCUtil;


public class Demo02
{
	public static void main(String[] args)
	{
		Connection conn = null;
		Savepoint sp = null;
		try
		{
			conn = JDBCUtil.getConnection();
			// 1、设置事务为手动提交
			conn.setAutoCommit(false);

			transferMoney(conn, 1000, "李四", "张三",false);
			
			// 如果失败,回滚到这个位置
			sp = conn.setSavepoint();
			
			boolean flag = true; //表示是否出现SQL异常
			transferMoney(conn, 500, "张三", "李四",flag);
		}
		catch (SQLException e)
		{
			System.out.println("转账失败!");
			try
			{
				// 2、 出现异常,需要回滚 (回滚到指定的代码段)
				conn.rollback(sp);
				System.out.println("回滚到指定位置操作成功!!!");
			}
			catch (SQLException ex)
			{
				ex.printStackTrace();
			}
		}
		finally
		{
			// 3、所有的操作执行成功, 提交事务
			try
			{
				conn.commit();
				System.out.println("执行完毕!");
			}
			catch (SQLException e)
			{
				e.printStackTrace();
			}
			JDBCUtil.closeQuietly(conn);
		}
	}

	
	private static void transferMoney(Connection conn, 
			long moneyNum, String userAdd, String userSub,
			boolean flag) throws SQLException
	{
		PreparedStatement pstmtAdd = null;
		PreparedStatement pstmtSub = null;

		try
		{
			String sqlAddMoney = "update T_Bank set money=money+? where username=?";
			pstmtAdd = conn.prepareStatement(sqlAddMoney);
			pstmtAdd.setLong(1, moneyNum);
			pstmtAdd.setString(2, userAdd);
			pstmtAdd.executeUpdate();
			
			if(flag)
			{
				throw new SQLException("模拟SQL执行出错");
			}

			String sqlSubMoney = "update T_Bank set money=money-? where username=?";
			pstmtSub = conn.prepareStatement(sqlSubMoney);
			pstmtSub.setLong(1, moneyNum);
			pstmtSub.setString(2, userSub);
			pstmtSub.executeUpdate();
		}
		finally
		{
			JDBCUtil.closeQuietly(pstmtAdd);
			JDBCUtil.closeQuietly(pstmtSub);
		}

	}
}





免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JDBC系列:(7)使用Connection操作事务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用SQLite执行事务操作

要在SQLite数据库中执行事务操作,可以按照以下步骤进行:打开数据库连接:首先,需要使用SQLite数据库连接到数据库。可以使用SQLite的API或者SQLite命令行工具来打开数据库连接。开始事务:在执行任何数据库操作之前,需要在连接
如何使用SQLite执行事务操作
2024-04-09

基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】

1、项目简介 本项目是一套基于JavaSE+JDBC使用控制台操作的简易购物系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
2023-12-23

一天一个shell命令 文本操作系列-linux dd使用教程

今天第一天写,先说下写shell脚本的基本知识 1. shell脚本以.sh 为扩展名,通常运行 ./${filename}.sh 或者 sh ${filename}.sh 2. shell 脚本开头以 #!/bin/bash #!读作 “
2022-06-04

FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么

这篇文章主要介绍了FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么文章都会有所收
2023-06-29

《银河麒麟高级服务器操作系统V10》使用

一言而论:讲了麒麟服务器V10的基本使用,包括终端、VNC 文章目录 前言基本架构环境硬件环境软件环境 麒麟安装步骤1.在宿主机上安装好VM,并且激活2.使用VM创建虚拟机3.启动虚拟机 终端常用点VNC的使用麒麟上安
《银河麒麟高级服务器操作系统V10》使用
2023-12-22

亚马逊服务器批量操作系统使用教程

1.登录亚马逊控制台首先,打开您的浏览器并访问亚马逊AWS管理控制台。输入您的凭据(用户名和密码)以登录您的账户。2.导航到EC2服务在控制台的顶部菜单栏中,找到并点击"服务"。在下拉菜单中,选择"EC2"以进入EC2服务页面。3.创建批量操作系统任务在EC2服务页面的左侧导航栏中,找到并点击"批量操作系统"。然后,点击"创建任务"按钮以开始创建一个新的批量操作系统任务。4.配置任务参数在创建任务页面中,您需要配置以...
2023-10-27

如何使用阿里云服务器上的CentOS操作系统

在云计算时代,阿里云服务器已经成为许多企业和个人的首选。本文将介绍如何在阿里云服务器上安装并使用CentOS操作系统。正文:一、安装CentOS操作系统在阿里云服务器上安装CentOS操作系统,首先需要连接阿里云服务器。你可以通过阿里云的控制台进行连接,也可以通过SSH客户端进行连接。连接后,你可以通过阿里云的命
如何使用阿里云服务器上的CentOS操作系统
2023-11-16

使用阿里云服务器操作系统的选择与管理

随着互联网技术的发展,云计算已经成为企业及个人的必备工具。其中,阿里云服务器作为国内领先的云计算服务提供商,其强大的计算能力和丰富的服务功能吸引了大量的用户。然而,在使用阿里云服务器的过程中,选择合适的操作系统和对其进行有效的管理是非常重要的。本篇文章将详细介绍如何在阿里云服务器上选择和管理操作系统。正文:阿里云
使用阿里云服务器操作系统的选择与管理
2023-11-22

阿里云服务器操作系统无法使用的解决方法

1.检查服务器状态首先,您需要检查阿里云服务器的状态,确保服务器处于正常运行状态。您可以登录阿里云控制台,查看服务器的运行状态和健康状况。如果服务器状态异常,您可以尝试重启服务器或联系阿里云技术支持获取帮助。2.检查操作系统安装如果服务器状态正常,但操作系统无法使用,可能是由于操作系统安装出现了问题。您可以通过以下步骤
2023-10-27

如何在阿里云服务器上安装和使用Linux操作系统

阿里云服务器是一种基于云计算技术的虚拟服务器,提供了灵活、安全、稳定的计算资源。在使用阿里云服务器时,用户需要选择适合自己的操作系统,并安装所需的应用程序。本文将介绍如何在阿里云服务器上安装和使用Linux操作系统,并通过具体的示例来演示如何打开应用程序。详细说明:1.安装Linux操作系统首先,在购买阿里云服务
如何在阿里云服务器上安装和使用Linux操作系统
2023-12-31

使用U盘安装银河麒麟服务器操作系统V10SP2出现“设置基础软件仓库时出错”报错导致无法继续安装的解决方法

文章目录 一、复现步骤二、解决方法方法①:配置银河麒麟外网源(仅限于互联网环境)方法②:修改安装引导启动参数 一、复现步骤 操作系统版本:银河麒麟高级服务器操作系统V10SP2-20210524(x86_64) 使用Rufu
2023-08-22

编程热搜

目录