Mysql事物回滚

1、事物是由一系列操作组成的一个逻辑工作单元
2、事物提交类型:

    自动提交:执行一个保存一个数据

   手动提交:先放入缓存,只有执行commit才能够保存到数据库中。在事物执行结束之后再提交,如果在事物执行期间发生错误,则回滚(rollback)到事物的开始
   设置事物回滚步骤:(在dao中写事物回滚)
   ①设置事物提交类型为手动提交:auto=false;
   ②在执行所有sql语句之后再将数据保存到数据库中
   ③如果出了异常就将事物进行回滚
   connection
   conn.setAutoCommit(false)   //提交方式,在第一个获得连接之后
 
    conn.commit();              //提交,在所有操作执行之后
    conn.rollback();            //事物回滚,数据回到原始状态。功能:清空缓存。在捕获异常的地方

案例如:银行中有存款,将存款和余额分开,则存一次款,余额就会改变,从而需要用到事物回滚

@Test
	public void testSaveMoney() {
		Connection conn = null;
		PreparedStatement pstmt = null;

		// 准备数据
		String accountId = "123456789";
		double money = 100;

		try {
			conn = JDBCUtils.getConnection();
			
/*****************************************************/			
			//设置事务为手动提交
			System.out.println("默认事务为"+conn.getAutoCommit());//true代表自动提交,false手动提交
			conn.setAutoCommit(false);
			System.out.println("事务为"+conn.getAutoCommit());
/*****************************************************/		
			
			// 向inaccount表中插入一条记录
			// sql: INSERT INTO inaccount(accountid,inbalance)
			// VALUES('123456789',100)
			String sql = "INSERT INTO inaccount(accountid,inbalance) VALUES(?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, accountId);
			pstmt.setDouble(2, money);
			pstmt.executeUpdate();//数据马上同步到数据库

			// 更新account表,将指定账号的余额加上100
			// UPDATE account SET balance=balance+100 WHERE
			// accountid='123456789'
			sql = "UPDATE account SET balance=balance+? WHERE accountid=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setDouble(1, money);
			pstmt.setString(2, accountId);
			
			//模拟因网络或不明原因出异常
			boolean flag = true;
			if(flag) {
				throw new SQLException("因网络或不明原因出异常!");
			}
			pstmt.executeUpdate();
			
/*****************************************************/			
			//提交事务
			conn.commit();
/*****************************************************/	
			
		} catch (SQLException e) {
			
/*****************************************************/			
			//回滚事务
			try {
				if(conn!=null) {
					conn.rollback();
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
/*****************************************************/
			
			e.printStackTrace();
		} finally {
			JDBCUtils.closeResource(conn, pstmt, null);
		}
	}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值