【09】JDBC实现事务管理

本文详细介绍了如何使用JDBC进行事务管理,包括Connection接口中的事务相关方法setAutoCommit、commit和rollback的使用,以及JDBC处理事务的典型代码格式,并提供了一个具体的转账案例来演示事务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 事务管理

开发中,在业务层(Service)控制事务!!!
在jdbc中处理事务,都是通过Connection完成的, 同一事务中所有的操作,都在使用同一个Connection对象

2. Connection接口中与事务相关的三个方法

  • setAutoCommit(boolean)

    • 设置是否为自动提交事务

    • 如果true(默认值就是true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务

    • 如果设置false,那么就相当于开启了事务了

      conn.setAutoCommit(false)表示开启事务;

  • commit()

    • 提交结束事务,conn.commit()表示提交事务;
  • rollback()

    • 回滚结束事务,conn.rollback()表示回滚事务;

3. JDBC处理事务的代码格式

	Connection conn = JDBCUtil.getConnection();
	try{
		conn.setAutoCommit(false); //开启事务			
		//执行代码	
		conn.commit();//提交事务
	}catch(Exception e){
		conn.rollback();//回滚
	}finally{
	    conn.setAutoCommit(true);
	}

4. 代码实现

Connection conn = null;
PreparedStatement pstmt = null;

@Test
public void testTransaction() {
	int deptNo = 30;
	conn = ConnectionUtil.getConnection();//获取连接对象
	
	try {
		//设置事务的提交方式为手动提交事务
		conn.setAutoCommit(false);
		
		//SQL语句
		String sql1 = "update Emp set deptNo =  null where deptNo = ?";
		String sql2 = "delete from Dept where deptNo = ?";
		
		//分别执行事务
		pstmt = conn.prepareStatement(sql1);
		pstmt.setInt(1, deptNo);
		pstmt.executeUpdate();
		
		pstmt = conn.prepareStatement(sql2);
		pstmt.setInt(1, deptNo);
		pstmt.executeUpdate();
		
		//提交事务
		conn.commit();
	} catch (Exception e) {
		try {
			conn.rollback();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		e.printStackTrace();
	}finally{
		try {
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

5. 具体案例 – 转账

  • DB
	CREATE TABLE "SCOTT"."BANK" (
	  	ID NUMBER NOT NULL PRIMARY KEY ,
	 	NAME VARCHAR2(50 BYTE) NOT NULL ,
	  	BALANCE FLOAT(126) NOT NULL 
	)
	
	INSERT INTO "SCOTT"."BANK" VALUES ('1', 'Tom', '100.00000000000000');
	INSERT INTO "SCOTT"."BANK" VALUES ('2', 'Jerry', '3000.0000000000000');
	
	ALTER TABLE "SCOTT"."BANK" ADD CONSTRAINT "CK_BALANCE" CHECK (balance >= 0) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
  • service interface
	/**
	 * 业务逻辑实现类
	 */
	public interface BankService {
		/**
		 * 转账
		 */
		public void ZhuanZhang(int fromId,int toId,double money);
	}
  • service impl
	/**
	 * 业务逻辑实现类
	 */
	public class BankServiceImpl implements BankService {

		private BankDao dao = new BankDaoImpl();

		@Override
		public void ZhuanZhang(int fromId, int toId, double money) {

			// 数据库连接对象
			Connection conn = JdbcUtil.getConnection1();
			System.out.println("service.impl.conn:"+conn);
			try {
				// 关闭自动提交:false
				// 开启事务
				conn.setAutoCommit(false);
	
				// 具体的业务
				dao.zhuanZhang(conn, fromId, -money);
				dao.zhuanZhang(conn, toId, money);
				
				// 提交事务
				conn.commit();
			} catch (SQLException e) {
				try {
					// 回滚事务
					conn.rollback();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				e.printStackTrace();
			} finally {
				try {
					if (null != conn)
						conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		   }
	  }
  • dao interface
	/**
	 * 数据访问接口
	 * @author Administrator
	 *
	 */
	public interface BankDao {
		/**
		 * 转账
		 * @param id 账号
		 * @param money 金额
		 * @throws SQLException 
		 */
		public void zhuanZhang(Connection conn,int id,double money) throws SQLException;
	}
  • dao.impl
	public class BankDaoImpl implements BankDao {
	
		@Override
		public void zhuanZhang(Connection conn, int id, double money) throws SQLException {
			String sql = "update Bank set balance = balance + ? where Id = ? ";
			
			// Connection conn = JdbcUtil.getConnection1();
			System.out.println("dao.impl.conn:" + conn);
	
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setDouble(1, money);
			pstmt.setInt(2, id);
			
			pstmt.executeUpdate();
		}
	
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值