JDBC系列:(7)使用Connection操作事务
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,事务ACID特性序号特性描述1原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。2一致性(Consistency)事务必须使数据库从一个一致性状
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
海岛奇兵在哪个服务器可以下载
汽车为什么要使用网络技术
优炫数据库中央企业联合采购
今朝网络安全众测
30岁转网络安全
计算机网络技术第八版书
奉化游戏软件开发流程
数据库中内连和外连的区别
上海电子网络技术参考价格
内存数据库 主流
在数据库安全中 角色是
网络安全公司哪家待遇好
蜗牛服务器英文名称
ddos考网络安全试题库
软件开发流水线是什么
广州荔支网络技术有限公司上市
无法通过ip连接数据库
鼎信 软件开发
服务器管理器怎么改名称
网络安全应具备技能
西安升华网络技术有限公司
软件开发专用笔记本用什么
数据库chr(10)
sql 数据库期末题库
qq吸粉的软件开发
收款失败服务器错误
小象直聘网络技术广东有限公司
服务器管理器恢复默认
软件开发包括哪些软件
现在没有电脑软件开发的公司了吗