自动事务_JDBC进阶(二)事务编程

431c0e0284698ffe73381e6ff01b1a02.png

一、事务简介

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

事务具有ACID特性:

  • 原子性(Atomicity) —— 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency) —— 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
  • 隔离性(Isolation) —— 一个事务的执行不能被其他事务干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability) —— 一个事务一旦提交,它对数据库中数据的改变就应该是永久的。接下来的其他操作或故障不应该对其执行结果有任何影响。

关于事务的基本理论在许多书籍资料中都能找到,这里就不赘诉了。

二、JDBC中事务的提交与回滚

如果在JDBC中不明确指定开启事务,那么所有的代码操作都在一个默认的事务中进行,默认的事务会自动开启,自动提交。因此如果我们需要在JDBC中手动操作事务,就首先需要关闭事务的自动提交。

JDBC中关于事务操作的API:

  • void setAutoCommit(boolean autoCommit) —— 设置事务是否自动提交,如果设置为false,表示手动提交事务。
  • void commit() —— 手动提交事务
  • void rollback() —— 手动回滚事务(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态)。
  • Savepoint setSavepoint() —— 设置事务回滚到哪个位置。

可以使用一个转账的示例来演示事务的提交与回滚:

d4c9ebe09f3ec425c5d9b3972b72ebc4.png

假设基于上面这个表完成一次转账操作:张三转账100元给李四。

// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test2";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {// 3. 关闭事务的自动提交机制conn.setAutoCommit(false);// 4. 预编译SQL// 从张三账户中减去100元String sql1 = "UPDATE bank SET money = money - 100 WHERE name = ?";	pstmt1 = conn.prepareStatement(sql1);pstmt1.setString(1, "张三");// 往李四账户中增加100元String sql2 = "UPDATE bank SET money = money + 100 WHERE name = ?";pstmt2 = conn.prepareStatement(sql2);pstmt2.setString(1, "李四");// 5. 执行SQL语句pstmt1.executeUpdate();pstmt2.executeUpdate();
} catch (Exception e) {// 6. 如果发生异常,则回滚事务conn.rollback();
} finally {// 6. 如果没有发生异常,则提交事务conn.commit();// 7. 关闭资源pstmt1.close();pstmt2.close();conn.close();
}

这样把转账操作放置在一个事务中执行,保证了事务的隔离性。即使转账操作发生异常,事务也能正确回滚,保证数据库中总金额仍然是2000。

三、JDBC中事务回滚到特定位置

调用setSavepoint()就能指定事务发生异常时回滚到特定位置:

// 省略参数代码// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
Savepoint sp = null;
try {// 3. 关闭事务的自动提交机制,并指定事务回滚到这个位置conn.setAutoCommit(false);sp = conn.setSavepoint();// 4. 预编译SQL// 从张三账户中减去100元String sql1 = "UPDATE bank SET money = money - 100 WHERE name = ?";	pstmt1 = conn.prepareStatement(sql1);pstmt1.setString(1, "张三");// 往李四账户中增加100元String sql2 = "UPDATE bank SET money = money + 100 WHERE name = ?";pstmt2 = conn.prepareStatement(sql2);pstmt2.setString(1, "李四");// 5. 执行SQL语句pstmt1.executeUpdate();pstmt2.executeUpdate();
} catch (Exception e) {// 6. 如果发生异常,则回滚事务到指定位置conn.rollback(sp);
} finally {// 6. 如果没有发生异常,则提交事务conn.commit();// 7. 关闭资源pstmt1.close();pstmt2.close();conn.close();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精华】详解Qt中的内存管理机制

前言 内存管理,是对软件中内存资源的分配与释放进行有效管理的方法和理论。 众所周知,内存管理是软件开发的一个重要的内容。软件规模越大,内存管理可能出现的问题越多。如果像C语言一样手动地管理内存,一会给开发人员带来巨大的…

【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

MySQL的发展历史和版本分支: 时间里程碑1996 年MySQL1.0 发布。它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具。1996 年 10 月3.11.1 发布。MySQL 没有 2.x 版本。2000 年ISAM 升级成 MyISAM 引擎。MySQL 开源。2003 年MySQL4.0 …

【转】2.2【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析

前一篇讲完了查询流程,我们是不是再讲讲更新流程、插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate()的方法&#…

【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构

MySQL的存储结构分为5级:表空间、段、簇、页、行。 1.表空间 TableSpace 上篇【MySQL】从InnoDB的内存结构、磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了,表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在…

【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log&…

python 读中文乱码_python字符乱码的解决小结

引言无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显…

ntnub原理怎么看_老电工由浅入深带你入门学PLC的工作原理和梯形图的编程规则...

PLC编程怎么学?很难吗?工控小白怎么入门学习PLC?需要为学习PLC编程做哪些准备?学习PLC编程时,前期一定要积累相关的理论知识,有了一定的基础,基础打扎实之后就是多练习了。今天推荐的重点&#…

【转】国密加密算法SM系列的C#实现方法

http://www.zhimengzhe.com/bianchengjiaocheng/Javabiancheng/22144.html 在网上搜索SM实现方法,按照上面网站提供方法总是出错,经过调试终于修改好了,给大家以参考,不走弯路了 base64修改,这个看需求,如…

1盒子刷webpad_拉宽带送的盒子也有春天:一招解放各种束缚限制

序言:故事要从一年多前开始说起了,话说...装了宽带之后,移动送了个电视盒子,一次未使用,角落吃灰一年多了,最近有个大胆的想法!其实是被逼迫无奈,孩子总是喜欢拿我手机刷抖音&#x…

php udp发送和接收_63、php利用原生socket创建udp服务

1、案例函数汇总2、案例通过socket创建udp服务,获取对端的ip和port信息。并进行打印2.1、udp服务源码/*** Copyright(C) Iamasb* project : 3、workerman相关知识点* explain : 原生socket创建创建udp服务* filename : socket_udp.php* author : Iamasb*/// 创建udp…

【转】C#实现SM3国密加密

C#实现SM3国密加密 本文主要讲解“国密加密算法”SM系列之SM3的C#实现方法,加密规则请详阅国密局发布的文档。 首先需第三方Nuget包:Portable.BouncyCastle (源码来自http://www.bouncycastle.org/csharp/) 1.1常规处理 /// &l…

mq集群要建传输队列吗_面试官:消息队列这些我必问!

作者:mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的?为什么要使用消息队列?消息队列有什么优点和缺点?kafka,activemq,rabbitmq,rocketmq 都有什么去呗?如何保证消息队列高可用…

【转】国密算法sm4 CBC模式加解密

一.什么是CBC模式? CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。 在CBC模式中,首先将明文分组与前一个密文分组进行异或运算&#xff0c…

【转】对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

版权声明:本文为作者原创,如需转载,请注明出处https://blog.csdn.net/weixin_42940826注:以下图片来自于《图解密码学》,这本书讲的更全面细致,建议阅读,在我资源库中有此书,还有使用…

中发生数据丢失_如何防止Redis脑裂导致数据丢失?

所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话&a…

【转】TransactionScope事务简介

在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString ConfigurationManager.ConnectionStrings["db"].ConnectionString; using (var conn new SqlConnection(connString)) { conn.Open(); using (IDbTransaction tran conn.BeginTransact…

网络通道数2的倍数_限流笔记-通道限流(二)

在工作中的时候,由于我负责的一个系统需要调用很多的第3方的系统,可是呢,这些个第3方的系统的性能完全不一致,有的好有的坏,还成本都不一样,当然了平时把,直接使用成本低的就行了,但…

mysql题目_MySQL练习题

创建下列表并创建相关约束问题1:查询出成绩表,而且student_id 后面要有对应的学生名,course_id 后面要有对应的课程名.1 SELECT2 score.sid,3 score.student_id,4 student.sname,5 score.course_id,6 course.cname,7 score.number8 FROM scor…

查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析

1.死锁的概念死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。发生死锁会返回ERROR:1213 错误提示,大部分的死锁In…

【转】二进制文件和ASCII文件有何区别

二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题。本文用简单的例子,试图展示其中的道道,希望能对菜鸟们有些帮助。 1、一个例子:两种100000 有程序: #includ…