事务实例(基于Mysql)

来源:互联网 发布:淘宝卖家星级 编辑:程序博客网 时间:2024/06/13 22:45

转账事例:

     A1000元,想转账给小B100元,小B1000元。

数据库内的操作:

     a的钱减少100,小b的钱增加100,然后这两个必需都得完成,如果有一个语句失败,更新的钱数就得回到原来的状态,因此此处需要数据库的事务。

 

还是采用三层架构:

     数据库连接采用c3p0连接池技术。

     Dao层采用dbutil框架。详细用法看我自己记的笔记。

     Dao层不做任何业务逻辑的处理,业务逻辑处理全部放到service层。在service层进行数据库事务的处理。

     Model层内的Account这个javabean必需和数据库内的字段一模一样。因为dbutil是采用的反射技术。

先贴上dao层和service层的代码:

   Dao层:

     publicclass TransformMysqlImpl {

    /*

     * 用事务进行转账 1.a的钱转到b a-100b+100但是dao层不能做任何业务逻辑处理所有的业务逻辑放到业务逻辑层 dao层只负责连接

     */

 

    private Connectionconn;

    private QueryRunnerqr =new QueryRunner(JdbcUtil.getSouce());

 

    public TransformMysqlImpl(Connection conn) {

        this.conn = conn;

    }

 

    public TransformMysqlImpl() {

 

    }

 

    publicvoid update(Account account) {

        String sql = "update account set balance=? where accountName=? ";

        Object params[] = { account.getBalance(), account.getAccountName() };

        try {

             qr.update(conn, sql, params);

        } catch (SQLException e) {

             //TODO Auto-generated catch block

             e.printStackTrace();

        }

 

    }

 

    //根据用户的姓名查处是account对象

 

    public Account quaryAccount(String name) {

        Account account = null;

        String sql = "select *from account where accountName=? ";

        // PreparedStatementprsmt=null;

        try {

             account = (Account) qr.query(sql, name,new BeanHandler<Account>(

                      Account.class));

             System.out.println(account.getAccountName()

                      + account.getAccountID());

             return account;

 

             // qr.query(sql,param, rsh)

        } catch (SQLException e) {

             //TODO Auto-generated catch block

             e.printStackTrace();

        }

         returnnull;

service层:

    publicclass Transform {

 

    private Connectionconn = JdbcUtil.getConn();

    private TransformMysqlImpltf =new TransformMysqlImpl(conn);

 

    publicvoid transform(String souceName, String targetName,double money) {

        //业务逻辑层

        //先查出账户

        Account source = tf.quaryAccount(souceName);

        // System.out.println(source.getName()+source.getBalance());

        Account target = tf.quaryAccount(targetName);

        //进行转账计算

        //转出账号减少钱

        source.setBalance(source.getBalance() - money);

        //转入账号加钱

        target.setBalance(target.getBalance() + money);

        //开启事务,放入dao

        try {

             conn.setAutoCommit(false);

 

             tf.update(source);

             inti = 1 / 0;

             tf.update(target);

             conn.commit();

 

        } catch (SQLException e) {

             try {

                  conn.rollback();

                  conn.commit();

 

             } catch (SQLException e1) {

                  //TODO Auto-generated catch block

                  e1.printStackTrace();

             } finally {

                  JdbcUtil.close(conn);

 

             }

 

             //TODO Auto-generated catch block

             e.printStackTrace();

        }

 

    }