在 Java 中,事务管理是确保数据一致性、完整性和原子性的关键机制,特别是在处理数据库操作时。以下是如何在 Java 中使用事务的一个详细示例,以银行转账业务为例。 我们来看一下银行账户的表结构。假设有一个名为 `account` 的表,包含两个字段:`Account`(账号,主键)和 `Balance`(余额)。转账业务涉及到从一个账号扣除金额并给另一个账号增加相应的金额,这两个操作必须被视为一个不可分割的整体,即事务。 接下来,我们需要一个数据库连接类 `DBConnection`,用于获取和关闭与数据库的连接。这个类通常会包含数据库的 URL、用户名和密码,以及静态块来加载 JDBC 驱动。例如: ```java package com.newer.con; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { public static final String URL = "jdbc:sqlserver://localhost:1433;databasename=newer"; public static final String USER = "sa"; public static final String PASSWORD = "123456"; static { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConn() { Connection con = null; try { con = DriverManager.getConnection(URL, USER, PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return con; } public static void close(Connection con) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (null != con) { con = null; } } } } ``` 然后,我们需要一个 `Account` 实体类,用来表示银行账户。它包含账号 `account` 和余额 `balance` 的属性,以及对应的 getter 和 setter 方法: ```java package com.newer.pojo; public class Account { private String account; private float balance; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public float getBalance() { return balance; } public void setBalance(float balance) { this.balance = balance; } public String toString() { StringBuffer buff = new StringBuffer(); buff.append("账号:").append(this.account).append("\t 余额:").append(this.balance); return buff.toString(); } } ``` 现在,我们将创建一个测试类 `TestTransaction` 来实现转账功能,这个类将使用 JDBC API 来执行 SQL 语句,并在事务内进行操作。在这个类中,我们先关闭自动提交模式,然后执行转账操作,最后手动提交事务。如果在转账过程中出现任何异常,我们会回滚事务以保持数据的一致性。 ```java package com.newer.test; import java.sql.*; public class TestTransaction { private PreparedStatement pstmt = null; private ResultSet rs = null; private Connection con = null; public boolean transAccount(Account src, Account target, float cash) { String selectSql = "SELECT * FROM account WHERE account=?"; String updateSql = "UPDATE account SET balance=? WHERE account=?"; try { con = DBConnection.getConn(); con.setAutoCommit(false); // 关闭自动提交 pstmt = con.prepareStatement(selectSql); pstmt.setString(1, src.getAccount()); rs = pstmt.executeQuery(); if (!rs.next()) { throw new SQLException("源账户不存在"); } float srcBalance = rs.getFloat("balance"); if (srcBalance < cash) { throw new SQLException("余额不足"); } pstmt.close(); rs.close(); pstmt = con.prepareStatement(updateSql); pstmt.setFloat(1, srcBalance - cash); pstmt.setString(2, src.getAccount()); pstmt.executeUpdate(); pstmt.setString(1, target.getAccount()); pstmt.setFloat(2, cash + target.getBalance()); pstmt.executeUpdate(); con.commit(); // 提交事务 return true; } catch (SQLException e) { try { if (con != null) { con.rollback(); // 回滚事务 } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); return false; } finally { DBConnection.close(con); if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } ``` 在这个例子中,`transAccount` 方法首先检查源账户是否存在并判断余额是否充足。接着,它关闭自动提交并开始手动提交事务。在转账过程中,如果发生任何异常,事务会被回滚,以防止不一致的数据状态。如果一切顺利,事务将在转账完成后被提交。 总结来说,Java 中的事务管理主要依赖于 JDBC API,通过 `Connection` 对象的 `setAutoCommit` 方法关闭自动提交,然后使用 `commit()` 或 `rollback()` 手动控制事务的提交或回滚。在实际应用中,通常会结合 Spring 框架的事务管理功能,以更简洁和优雅的方式处理事务。此外,还可以使用事务隔离级别和事务属性来进一步优化事务的性能和安全性。
- 粉丝: 2
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 毕设和企业适用springboot社交电商类及跨平台协作平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及云端储物管理系统源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及远程医疗平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及在线系统源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及企业数字化转型平台源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及人工智能医疗平台源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及人力资源管理平台源码+论文+视频.zip
- 毕设和企业适用springboot全渠道电商平台类及汽车信息管理平台源码+论文+视频.zip
- 毕设和企业适用springboot全渠道电商平台类及食品安全追溯平台源码+论文+视频.zip
- 毕设和企业适用springboot全渠道电商平台类及人工智能客服平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及在线药品管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及智慧医疗管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能类及智能农场管理系统源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及食品安全追溯平台源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及数据智能化平台源码+论文+视频.zip
- 毕设和企业适用springboot社交电商类及在线教育互动平台源码+论文+视频.zip