事务实例(基于Mysql)

转账事例:

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

数据库内的操作:

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

 

还是采用三层架构:

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

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

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

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

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

 public class TransformMysqlImpl {

     /*

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

      */



     private Connection conn;

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



     public TransformMysqlImpl(Connection conn) {

         this.conn = conn;

     }



     public TransformMysqlImpl() {



     }



     public void 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=? ";

         // PreparedStatement prsmt=null;

         try {

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

                       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();

         }

          return null;

service层:

     public class Transform {



     private Connection conn = JdbcUtil.getConn();

     private TransformMysqlImpl tf = new TransformMysqlImpl(conn);



     public void 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);

              int i = 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();

         }



     }

 

你可能感兴趣的:(JavaWeb,数据库)