什么是数据库事务以及数据库事务的原则

/*
1.什么叫数据库事务?
事务:一组逻辑操作单元,使数据从一种状态变换到另外一种状态。
    >一组逻辑操作单元:一个或多个DML操作。

2.事务处理的原则:
    保证所有事务都作为一个工作单元来执行,即出现了故障,都不能改变这种执行方式。
    当一个事务中执行多个操作时,要么所有事务都被提交(commit)那么这些修改将永久保存下来、
    要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初的状态

3.数据一旦提交则无法回滚

4.哪些操作会导致数据的自动提交?
        >DDL操作一旦提交则自动提交
            >set autcommit=false的方法对DDL无效
        >DML默认情况下,一旦执行,则自动提交
            >我们可以通过set autcommit=false的方式取消DML操作的自动提交
        >默认在关闭连接时,会自动的提交数据

 */
//*****************************考虑数据库事务的转账操作*******************************

    @Test
    public void testUpdateWithtx()  {
        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
            //取消数据的自动提交功能
            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 throwables) {
                throwables.printStackTrace();
            }
        } finally {
            try {
                conn.setAutoCommit(true);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            JDBCUtils.closeResource(conn,null);
        }
    }

    //通用的增删改操作(考虑上事务的改进版本)
    public int update(Connection conn,String sql ,Object...args){//sql中占位符的个数应该和可变形参的长度相同
        PreparedStatement ps = null;
        try {
            //预编译sql语句 返回到PrepareStatement实例
            ps = conn.prepareStatement(sql);
            //填充 占位符
            for (int i = 0; i < args.length ; i++) {
                ps.setObject(i + 1 ,args[i]);
            }
            //4.执行
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,ps);
        }
        return 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值