前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java事物处理

java事物处理

作者头像
汤高
发布2018-01-11 16:28:33
1.1K0
发布2018-01-11 16:28:33
举报
文章被收录于专栏:积累沉淀

事物处理 什么是事物:个人认为事物,就是对数据库进行一组操作动作的集合,如果一组处理步骤要么全发生,要么一步也不执行,称这组处理步骤为一个事物。当所有的步骤完整地被执行,称该事物被提交,当一部分步骤导致执行失败,则事物必须回滚到以前的执行状态.

数据库的事务是保证数据完整性的一种机制,简而言之,就是怎样确保数据的执行过程要么都成功,要么都失败,举例子为假设你要给银行还款,需要从你的银行卡中扣除相关的金额也需要在你的信用卡上加钱,这个流程务必是一个完整的流程,不能拆分,如果从你的银行卡中扣除了钱,但是加钱的流程是失败的,这个时候用户是吃亏的,反之银行则会亏本,所以这就涉及到了事务的机制。

1.原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。 2.一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。 3.隔离性(isolcation):一个事务处理对另一个事务处理没有影响。 4.持续性(durability):事务处理的效果能够被永久保存下来 。 概括起来可以用ACID来表述

事务处理四步曲 1 connection.setAutoCommit(false); //把自动提交关闭 2 正常的DB操作 //若有一条SQL语句失败了,自动回滚 3 connection.commit() //主动提交 或 connection.rollback() //主动回滚 4 connection.setAutoCommit(true); //把自动提交打开

举例 :银行账户 第一个用户存了1000块钱 第二个没钱 第一个用户向第二个用户转账 (约束 存款不能小于0)

import java.sql.SQLException;

import com.yc.dao.DBHelper;

public class Test { //使用隐式事务来完成转账的危害 => 银行破产 public static void main(String[] args) throws SQLException {

代码语言:javascript
复制
    DBHelper db=new DBHelper();

    //业务流程: 2号用户+10000,   1号用户-10000
    //  2号用户+10000
    String sql="update bankaccount set balance=balance+10000 where aid='2'";
    db.doUpdate(sql, null);
    //1号用户-10000
    sql="update bankaccount set balance=balance-10000 where aid='1'";
    db.doUpdate(sql, null);
}

} 导致第一个用户钱没变 还是1000块 而第二个用户有了10000块 使用事物处理: public class Test2 { //使用了事务 public static void main(String[] args) throws SQLException { String sql = “update bankaccount set balance=balance+? where aid=?”; List params = new ArrayList(); params.add(“10000”); params.add(“2”);

代码语言:javascript
复制
    String sql2 = "update bankaccount set balance=balance-? where aid=?";
    List<String> params2 = new ArrayList<String>();
    params2.add("10000");
    params2.add("1");
    List<String> sqls = new ArrayList<String>();
    sqls.add(sql);
    sqls.add(sql2);

    List<List<String>> paramsList = new ArrayList<List<String>>();
    paramsList.add(params);
    paramsList.add(params2);
    DBHelper db = new DBHelper();
    Connection con = db.getCon();
    // 关闭隐式事务
    con.setAutoCommit(false);
    try {
        for (int i = 0; i < sqls.size(); i++) {
            PreparedStatement pstmt = con.prepareStatement(sqls.get(i));
            List<String> paramsl = paramsList.get(i);
            for (int j = 0; j < paramsl.size(); j++) {
                pstmt.setString(j + 1, paramsl.get(j));
            }
            pstmt.executeUpdate();
        }
        con.commit();
    } catch (SQLException e) {
        e.printStackTrace();
        con.rollback();
    } finally {
        con.setAutoCommit(true);
        con.close();
    }
}

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-06-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档