【Java】浅谈JDBC事务处理

浅谈Java的“事务处理” 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。事务必须服从ISO/IEC所制定的ACID原则。1、原子性即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换2、一致性事务的执行使得数据库从一种正确状态转换成另外一种正确状态3、隔离性。 阅读详情

在进行数据库修改时需注意事务处理问题,否则程序意外停止后会导致数据库数据不正确,下面笔者简单说一下JDBC中怎么进行事务处理。

MySQL表结构如下所示:

CREATE table TX_test(id int(11) not null AUTO_INCREMENT,namevarchar(5),money int(11)

,PRIMARY KEY (`id`));

现有数据如下:

id name money

1,"张三",400

2,"李四",10

若使用下面JDBC代码更新数据库:

package txTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TxTest {
	public static void main(String[] args) throws Exception{
		update();
	}
	public static void update() throws Exception{
		try {
			Class.forName("com.mysql.jdbc.Driver");  // 注册驱动		
		} catch (Exception e) {
			e.printStackTrace();
		}
		String dbUrl="jdbc:mysql://localhost:3306/test";
		String dbUserName="root";
		String dbPassword="root";
		Connection conn = null;
		Statement st=null;
		ResultSet rs=null;
		try {
			conn = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
			st=conn.createStatement();
			String sql01="update tx_test set money=money-10 where name='张三'";
			String sql02="update tx_test set money=money+10 where name='李四'";
			String sql03="select money from tx_test where name='张三'";
			//修改张三账户的钱
			st.executeUpdate(sql01);
			
			//查询张三账户的钱,如果钱少于或等于390则抛出运行时异常
			float money=0.0f;
			rs=st.executeQuery(sql03);
			while(rs.next()){
				money=rs.getFloat("money");
			}
			if(money<=390){
				throw new RuntimeException("账户所剩余额不多!");
			}
			
			//增加李四账户的钱
			st.executeUpdate(sql02);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//rs.close();			
		st.close();
		conn.close();		
	}
}

最终数据如下:

id name money

1,"张三",390

2,"李四",10

我们发现张三的钱少了,可是李四的钱并没有增加,这样就凭空消失了10元,违反了事务的原子性。将代码更改一下:

package txTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TxTest {
	public static void main(String[] args) throws Exception{
		update();
	}
	public static void update() throws Exception{
		try {
			Class.forName("com.mysql.jdbc.Driver");  // 注册驱动		
		} catch (Exception e) {
			e.printStackTrace();
		}
		String dbUrl="jdbc:mysql://localhost:3306/test";
		String dbUserName="root";
		String dbPassword="root";
		Connection conn = null;
		Statement st=null;
		ResultSet rs=null;
		try {
			conn = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
			//关闭Connection自动提交
			conn.setAutoCommit(false);
			st=conn.createStatement();
			String sql01="update tx_test set money=money-10 where name='张三'";
			String sql02="update tx_test set money=money+10 where name='李四'";
			String sql03="select money from tx_test where name='张三'";
			//修改张三账户的钱
			st.executeUpdate(sql01);
			
			//查询张三账户的钱,如果钱少于或等于390则抛出运行时异常
			float money=0.0f;
			rs=st.executeQuery(sql03);
			while(rs.next()){
				money=rs.getFloat("money");
			}
			if(money<=390){
				throw new RuntimeException("账户所剩余额不多!");
			}
			
			//增加李四账户的钱
			st.executeUpdate(sql02);
			//提交操作
			conn.commit();
		} catch (Exception e) {
			if(conn!=null){
				//回滚事务
				conn.rollback();
			}
			e.printStackTrace();
		}
		//rs.close();			
		st.close();
		conn.close();		
	}
}

最终输出的数据仍为张三的钱是390,表示再一次运行程序后张三没有没扣钱。

id name money

1,"张三",390

2,"李四",10

如果在回滚中需要设置回滚保存点的话可用Savepoint接口,在需要设置回滚点的代码后面加上sp=conn.setSavepoint();代码,提交时用conn.rollback(sp);   conn.commit();进行提交。


Author:事始

Sign:只要你还在尝试,就不算失败。
三极管自激升压电路设计 - 从参数计算到实践验证 本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。 阅读详情

相关推荐

PMSM无感foc控制(滑模-反正切-PLL)【仿真模型搭建教程】(附模型)

本文主要目的是教大家如何把文献中的公式转换成仿真模型。 首先介绍滑模控制的原理及如何搭建simulink模型。 1.1基于反电势估计位置原理 永磁同步电机在静止坐标系αβ下的电压方程: 扩展反电动势包含转子位置信息,并且αβ轴下扩展反电动势的反正切函数正好就等于位置角theta。 1.2 滑模控制原理(比较重要的点是以电机电流模型推导展开) 通过滑模观测得到鲁棒性比较高的αβ轴下扩展反电动势,并求其反正切函数,得到位置信息。 /*********************...

weixin_44769876的博客 1万+

Java事务处理-JDBC事务例子

买书的例子 程序应该将图书数量的操作和更新account用户余额的操作作为一个事务来处理,只有这两个操作都完成的情况下,才能提交事务,否则就回滚事务。   1  buy.html html>     head>         title>购买图书/title>     /head>     body>         购买《Servlet/JSP深入详解》p>   

robbinBlog 1229

【通信原理 入坑之路】—— 详解IQ调制以及星座图原理

文章目录一. IQ调制与解调的原理与过程二.PSK(相移键控)和IQ调制的关系:2.1 用IQ调制实现QPSK调制 一. IQ调制与解调的原理与过程 IQ调制的定义是:“IQ调制就是数据分为两路,分别进行载波调制,两路载波相互正交。I是in-phase(同相), q是 quadrature(正交)” 我们通过下面的示意图介绍IQ调制的过程: 首先,信号分成两路:I路和Q路(为了方便理解我们把这两...

凝望,划过星空的博客 11万+

java jdbc中事务处理

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class OracleTransaction {  /**   * @param args   */  public

lolashe 856

中国全国地面站点数据(1981-2010)、月平均气象、月平均降水、月平均相对湿度、月最大降水、月最高温度最低温度、月最高温平均值最低温平均值、高低温站点基础数据,气候数据

中国全国地面站点数据(1981-2010)、月平均气象、月平均降水、月平均相对湿度、月最大降水、月最高温度最低温度、月最高温平均值最低温平均值、高低温站点基础数据 b_china_mon_avg_data_pressure月平均气象 b_china_mon_avg_data_rain月平均降水 b_china_mon_avg_data_rhu月平均相对湿度 b_china_mon_max_data_rain月最大降水 b_china_mon_max_min_data_tem月最高温度最低温度 b_china

无极低码 2万+

手把手教你学 GPU KMD”相关内容的专栏简介与目录

本专栏系统讲解GPU内核模式驱动(KMD)开发技术,涵盖四大核心模块:1)GPU驱动架构基础,解析UMD/KMD协同机制;2)KMD核心功能,包括内存管理、命令提交、中断处理等;3)底层硬件交互,详解PCIe/DMA传输、多级页表等;4)实战进阶,结合Linux DRM框架代码分析,探讨GPU虚拟化与性能优化。面向具备OS和C语言基础的开发者,提供从理论到实践的完整学习路径,帮助深入理解图形/计算驱动栈的底层实现原理。

amy_mhd的博客 154

Java - JDBC中如何进行事务处理?

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。除此之外,从JDBC 3...

了解➔熟悉➔掌握➔精通 3万+

qt open3dBPA重建

open3d BPA重建

阁楼 516

java jdbc事务处理_JDBC事务处理机制探秘

Java中的事务处理一般情况下,J2EE应用服务器支持JDBC事务、JTA(Java Transaction API)事务、容器管理事务。一般情况下,***不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。下面我们列举两种JDBC事务处理方式。1、JavaBean中使用JDBC事务处理在JDBC中怎样将...

weixin_35120608的博客 240

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

zhengzaifeidelushang的博客 3290

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)

华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。

qq_45776114的博客 1794

浅谈JDBC 基础总结

JDBC 持久化概述 持久化(persistence)**: 把数据保存到可掉电式存储设备中以供之后使用。 数据持久化意味着将内存中的数据保存到硬盘上加以”固化” 而持久化的实现过程大多通过各种关系数据库来完成, 将内存中的数据存储在关系型数据库中 当然也可以存储在磁盘文件、XML数据文件中 而在 Java中,数据库存取技术只能通过 JDBC 来访问数据库。 JDBC 访问数据库的形式主要有两种: 1. 直接使用 JDBC 的 API 去访问数据库服务器 (MySQL/Oracle). 2. 间

weixin_47057820的博客 1677

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6491

浅谈jdbc

一:jdbc的链接过程 1、加载类库(驱动jar包)到JVM mysql-connector-java 5:com.mysql.jdbc.Driver mysql-connector-java 6以上 :com.mysql.cj.jdbc.Driver Class.forName("com.mysql.cj.jdbc.Driver"); 2、加载驱动建立连接 (1)useUnicode=tru...

qq_36517910的博客 196

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

分布式事务之浅谈JDBC事务与JTA事务

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。所以本文暂不讨论容器事务。本文主要介绍J2EE开发中两个比较基本的事务:JDBC事务和JTA事务。 JDBC事务 JDBC的一切行为包括事务是...

丿微风乍起的博客 451

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

浅谈JDBC操作MySQL数据库实现事务管理

JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。简单来说,JDBC就是用Java对数据库实现一定操作的API。 下面,本文将浅谈用Java语言操作数据库进行事务管理的步骤。 JDBC操作数据库进行事务管理 1. 建立到特定数据库的连接 Connection con =DriverManager.getConnection(url,user,pwd); 此处的url,user,pwd建议在前面以字符串类型设定好,在DriverManager.

zgsdlr的博客 1027

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

浅谈JDBC的升级之路

JDBC: 虽然由于快节奏的开发,编程速度的追求,越爱越多的MVC框架出现,比如持久层的hibernate, mybatis等等,他们对Dao层的支持都很强大,既快速,又简便。但是他们的底层同样是使用了JDBC, 为了追求高速简便,我们可以不使用JDBC,但一定要了解JDBC。了解JDBC也有助于学习其他持久层框架。 java和数据库交互需要中间程序作为中转。在很早以前,数

张东旭 1024

浅谈java中的事务

一、定义 通常的观念认为,事务仅与数据库有关。 通俗的理解,事务就是一组原子操作单元。从数据库的角度看,就是一系列sql指令的操作实现。要么全部执行成功,要么全部撤销不执行。 那么,java的事务又是什么?之间有啥联系? 实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,Ja...

晚起的鸟儿 202

浅谈 JTA 事务

分享知识 传递快乐 在谈 JTA 事务之前先了解一下什么是事务和 JDBC 事务 事务 事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,一个逻辑工作单元必须有四个属性:原子性、一致性、隔离性和持久性,又称 (ACID) 属性,只有这样才能成为一个事务。事务一般都是与数据库打交道的操作,其中的操作要么全做要么全都不做。 Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务和容器事务。其中JDBC的事务操作用法比较简单,适合于处理同一个数据..

旷野历程 2233

java 事务级别_【原创】浅谈java事务及隔离级别

【原创】浅谈java事务及隔离级别点击上方“java进阶架构师”,选择右上角“置顶公众号”20大进阶架构专题每日送达目录一:事务的定义及作用二:事务的四个特性(ACID)三:JDBC事务四:隔离级别五、总结一:事务的定义及作用事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务一般由事务开始(begin ...

weixin_42501848的博客 418

java oracle executeupdate 无效_【原创】浅谈java事务及隔离级别

点击上方“java进阶架构师”,选择右上角“置顶公众号”20大进阶架构专题每日送达目录一:事务的定义及作用二:事务的四个特性(ACID)三:JDBC事务四:隔离级别五、总结一:事务的定义及作用事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务一般由事务开始(begin transaction)...

weixin_30061949的博客 190

java 事务_「原创」浅谈java事务及隔离级别

目录一:事务的定义及作用二:事务的四个特性(ACID)三:JDBC事务四:隔离级别五、总结一:事务的定义及作用事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务一般由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。那么,在平时的应用中,为...

weixin_39947961的博客 111

java 模仿支付成功_「原创」浅谈java事务及隔离级别

目录一:事务的定义及作用二:事务的四个特性(ACID)三:JDBC事务四:隔离级别五、总结一:事务的定义及作用事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务一般由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。那么,在平时的应用中,为...

weixin_39834328的博客 135

begintransaction事务的作用_「原创」浅谈java事务及隔离级别

目录一:事务的定义及作用二:事务的四个特性(ACID)三:JDBC事务四:隔离级别五、总结一:事务的定义及作用事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务一般由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。那么,在平时的应用中,为...

weixin_34929072的博客 2359

浅谈java连接池

1. 引言   近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机   应用程序已从传统的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期,主要使用的技术是CGI﹑ASP﹑PHP等。之后,...

weixin_30433075的博客 63

浅谈J2EE

Java版本      J2ME:功能非常有限,用于嵌入式设备      J2SE:包含原始的核心类库,用于桌面应用程序和浏览器中的Applet      J2EE:功能非常全面,用于数据处理和服务器端应用      确切的说并不是Java分为三个版本,SE、EE、ME都是Java,而真正的SE是EE和 ME的技术基础,SE包括了Java语言基础内容。在基础内容之上扩充不同领域的规

李颖杰--廊坊师范学院七期信息技术提高班 1248
上一篇: 【Java】JDBC向MYSQL读写大文本和二进制文件
下一篇: 【JS】JavaScript中对象的创建与原型模式
励志故事
博客等级 码龄12年 99粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值