JDBC系列:(7)使用Connection操作事务
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,事务ACID特性序号特性描述1原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。2一致性(Consistency)事务必须使数据库从一个一致性状
千家信息网最后更新 2025年11月10日JDBC系列:(7)使用Connection操作事务
| 序号 | 特性 | 描述 |
|---|---|---|
| 1 | 原子性(Atomicity) | 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 |
| 2 | 一致性(Consistency) | 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 |
| 3 | 隔离性(Isolation) | 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 |
| 4 | 持久性(Durability) | 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 |
| 序号 | 方法 | 作用 |
|---|---|---|
| 1 | void setAutoCommit(boolean autoCommit) | 设置事务是否自动提交 如果设置为false,表示手动提交事务。 |
| 2 | void commit() () | 手动提交事务 |
| 3 | void rollback() | 回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。) |
| 4 | Savepoint 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;/** * // 转账,使用事务 * @author RK * */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); } } /** * 模拟银行转账 * @param conn 数据库连接 * @param moneyNum 转账的金额 * @param userAdd 收到Money的用户 * @param userSub 支出Money的用户 * @param flag 是否模拟SQL Exception异常,true表示出现,false表示不出现 * @throws SQLException */ 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;/** * // 转账,使用事务, 回滚到指定的代码段 * @author RK * */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); } } /** * 模拟银行转账 * @param conn 数据库连接 * @param moneyNum 转账的金额 * @param userAdd 收到Money的用户 * @param userSub 支出Money的用户 * @param flag 是否模拟SQL Exception异常,true表示出现,false表示不出现 * @throws SQLException */ 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); } }}
事务
数据
转账
数据库
用户
成功
代码
手动
一致
一致性
状态
张三
李四
隔离
位置
原子
多个
序号
持久性
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
浏览器软件开发有前途吗
查看其他数据库中的表
网盘单独数据库
web服务器调用jsp的过程
网络安全有关的字眼
网络安全与技术文献
网络安全教育手操报
网络安全危害预防英语作文
社区网络安全工作计划方案
网页软件开发用什么软件
更改数据库服务名
sql一般是用什么数据库
max导入数据库文件太大了
数据库技术的发展ppt
云服务器有挖矿程序
下一步加强网络安全
20届计算机网络技术
象山ios软件开发设计
查找数据库最大值
数据库访问对象模式
站群服务器多ip搭建
软件开发几个阶段的质量问题
江苏正规软件开发生产厂家
数据库创建索引停了
web之父的创业选择网络安全
山东c语言软件开发服务费
看理论数据库
广西数据库安全箱生产厂家
邢台软件开发参考价
贵阳网络安全资讯高品质的教学