数据库转账事务处理

tech2023-06-17  124

数据库转账事务处理

package com.sammery.transaction; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import com.sammery.util.JDBCUtils; /* * 1.什么叫数据库事务? * 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 * > 一组逻辑操作单元,一个或多个DML操作。 * * 2.事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障, * 都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被 * 提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃 * 所作的所有修改,整个事务回滚(rollback)到最初状态。 * * 为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元∶当它全部 * 完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全 * 部视为错误,所有从起始点以后的操作应全部回退到开始状态。 * * 3.数据一旦提交,就不可回滚 * * 4.哪些操作会导致戴护具的自动提交? * > DDL操作一旦执行,都会自动提交。 * > set autocommit = false 对DDL操作失效 * > DML默认情况下,一旦执行,就会自动提交。 * > 我们可以通过 set autocommit = false 的方式取消DML操作的自动提交。 * > 默认在关闭连接时,会自动的提交数据 * * */ public class TransactionTest { /* 针对于数据表user_table来说, * AA用户给BB用户转账100 * * UPDATE user_table SET balance = balance - 100 WHERE `user` = 'AA' * UPDATE user_table SET balance = balance + 100 WHERE `user` = 'BB' * */ //未添加业务逻辑 @Test public void testUpdate(){ String sql1 = "UPDATE user_table SET balance = balance - 100 WHERE `user` = ?"; update(sql1,"AA"); //模拟网络异常 System.out.println(10/0); String sql2 = "UPDATE user_table SET balance = balance + 100 WHERE `user` = ?"; update(sql2,"BB"); } public int update(String sql,Object ...args){ Connection connection = null; PreparedStatement preparedStatement = null; try { //1.建立连接 connection = JDBCUtils.getConnection(); //2.预编译SQL语句,返回PreparedStatement实例 preparedStatement = connection.prepareStatement(sql); //3.填充占位符 for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i+1, args[i]); } //4.执行 return preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally{ //5.关闭资源 JDBCUtils.closeResource(connection, preparedStatement); } return 0; } //增加业务逻辑版 @Test public void testUpdate2() { Connection conn = null; try { conn = JDBCUtils.getConnection(); System.out.println(conn); //true conn.setAutoCommit(false); String sql1 = "UPDATE user_table SET balance = balance - 100 WHERE `user` = ?"; update(conn,sql1,"AA"); //模拟网络异常 // System.out.println(10/0); String sql2 = "UPDATE user_table SET balance = balance + 100 WHERE `user` = ?"; update(conn,sql2,"BB"); System.out.println("转账成功!!!"); //提交数据 conn.commit(); } catch (Exception e) { e.printStackTrace(); //发生异常后回滚数据 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { try { //恢复为自动提交 conn.setAutoCommit(true); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public int update(Connection conn,String sql,Object ...args){ PreparedStatement preparedStatement = null; try { //2.预编译SQL语句,返回PreparedStatement实例 preparedStatement = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i+1, args[i]); } //4.执行 return preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally{ //5.关闭资源 JDBCUtils.closeResource(null, preparedStatement); } return 0; } }
最新回复(0)