您当前的位置: 首页 > 

Charge8

暂无认证

  • 0浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDBC 事务、批处理和获取主键

Charge8 发布时间:2019-09-09 16:37:29 ,浏览量:0

一、事务处理

       事务(Transaction,简写为tx):在数据库中,事务是指一组逻辑操作,不论成功与失败都作为一个整体进行工作,要么全部执行成功,要么全部不执行(执行失败)。

1、处理事务的两个动作

    1)提交(commit):在整个事务中,所有的逻辑操作都正常执行成功,则提交事务。

    2)回滚(rollback):在整个事务中,有一个或多个逻辑操作执行失败,则回滚事务,撤销该事务中的所有操作,恢复到最初的状态。

2、事务的ACID属性

1)原子性(Aromicity):事务是应用中不可再分的最小逻辑执行单位,要么都执行成功,要么都不执行。
2)一致性(Consistency):事务结束后,数据库中的数据是合法正确的(数据不被破坏)。
3)隔离性(Isolation):并发执行的事务之间彼此相互独立、互不干扰。
4)持久性(Durability):事务提交后,数据时永久性对的、不可回滚。

3、在代码中处理事务

    1)在JDBC中缺省情况下,事务是自动提交的,控制事务必须先设置事务为手动提交

    2)手动提交事务

    3)若出现异常必须回滚事务

Connection接口方法:

    • voidsetAutoCommit(boolean autoCommit)

      将此连接的自动提交模式设置为给定状态。

      voidcommit()

      使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。

      voidrollback()

      撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。

    /**
     * 赵云向赵子龙转账1000
     */
    @Test
    public void testTx() {
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1、设置事务手动提交
            conn.setAutoCommit(false);
            //查询赵云账号余额
            String sql = "SELECT * FROM t_user WHERE username=? and account >=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"赵云");
            ps.setLong(2,1000L);
            rs = ps.executeQuery();
            if (!rs.next()){
                throw  new RuntimeException("余额不足!");
            }
            //赵云减1000
            sql = "UPDATE t_user set account=account-? WHERE username=?";
            ps = conn.prepareStatement(sql);
            ps.setLong(1,1000L);
            ps.setString(2,"赵云");
            ps.executeUpdate();
            //模拟异常
            int i = 1/0;
            //赵子龙加1000
            sql = "UPDATE t_user set account=IFNULL(account,0) +? WHERE username=?";
            ps = conn.prepareStatement(sql);
            ps.setLong(1,1000L);
            ps.setString(2,"赵子龙");
            ps.executeUpdate();
            //2、手动提交事务
            conn.commit();
        }catch (Exception e){
            e.printStackTrace();
            try {
                //3、回滚事务
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally {
            JdbcUtil.close(conn, ps, rs);
        }
    }
二、批处理操作

       批量操作(batch):当需要成批插入或者更新记录时,可以采用Java的批量更新机制,它允许多条语句一次性提交为数据库批量处理。通常情况下比单独提交处理更高效。

JDBC的批量处理语句的方法:

1、Statement接口批处理

      一次性可以执行多条SQL语句,需要编译多次。

    • voidaddBatch(String sql)

      将给定的SQL命令添加到此 Statement对象的当前命令列表中。

      int[]executeBatch()

      将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。

      voidclearBatch()

      清空此 Statement对象的当前SQL命令列表。

    /**
     *  Statement 未使用批量处理
     *  InnodDB耗时:6111ms
     *  添加rewriteBatchedStatements=true后
     *  InnodDB耗时:6042ms
     * @throws Exception
     */
    @Test
    public void testSaveByStatement() throws Exception {
        long begin = System.currentTimeMillis();
        Connection conn = JdbcUtil.getConnection();
        Statement st = null;
        for (int i = 0; i             
关注
打赏
1664721914
查看更多评论
0.0379s