zoukankan      html  css  js  c++  java
  • jdbc如何处理事务

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。

    JDBC事务

    在JDBC中处理事务,都是通过Connection完成的。

    同一事务中所有的操作,都在使用同一个Connection对象。

    ①JDBC中的事务    

    Connection的三个方法与事务有关:

    • setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
    • commit():提交结束事务。
    • rollback():回滚结束事务。

    JDBC处理事务的代码格式:

    复制代码
    try{
         con.setAutoCommit(false);//开启事务
         ......
         con.commit();//try的最后提交事务      
    } catch() {
        con.rollback();//回滚事务
    }
    复制代码

    示例:

    复制代码
     1 public class AccountDao {
     2     /*
     3     * 修改指定用户的余额
     4     * */
     5     public void updateBalance(Connection con, String name,double balance) {
     6         try {
     7             String sql = "UPDATE account SET balance=balance+? WHERE name=?";
     8             PreparedStatement pstmt = con.prepareStatement(sql);
     9             pstmt.setDouble(1,balance);
    10             pstmt.setString(2,name);
    11             pstmt.executeUpdate();
    12         }catch (Exception e) {
    13             throw new RuntimeException(e);
    14         }
    15     }
    16 }
    复制代码
    复制代码
     1 import cn.itcast.jdbc.JdbcUtils;
     2 import org.junit.Test;
     3 import java.sql.Connection;
     4 import java.sql.SQLException;
     5 
     6 public class Demo1 {
     7     /*
     8     * 演示转账方法
     9     * 所有对Connect的操作都在Service层进行的处理
    10     * 把所有connection的操作隐藏起来,这需要使用自定义的小工具(day19_1)
    11     * */
    12     public void transferAccounts(String from,String to,double money) {
    13         //对事务的操作
    14         Connection con = null;
    15         try{
    16             con = JdbcUtils.getConnection();
    17             con.setAutoCommit(false);
    18             AccountDao dao = new AccountDao();
    19             dao.updateBalance(con,from,-money);//给from减去相应金额
    20             if (true){
    21                 throw new RuntimeException("不好意思,转账失败");
    22             }
    23             dao.updateBalance(con,to,+money);//给to加上相应金额
    24             //提交事务
    25             con.commit();
    26 
    27         } catch (Exception e) {
    28             try {
    29                 con.rollback();
    30             } catch (SQLException e1) {
    31                 e.printStackTrace();
    32             }
    33             throw new RuntimeException(e);
    34         }
    35     }
    36     @Test
    37     public void fun1() {
    38         transferAccounts("zs","ls",100);
    39     }
    40 }
    复制代码
     
     
     
  • 相关阅读:
    无聊死了,救我
    人间奇事:什么都涨,就工资不涨
    关于Javascript Hijacking
    参考答案:关注成本和投资回报率
    IE中一个值得关注的JS问题
    100%高度的div(转载)
    维基百科开放拉
    乱弹:出名、中医、程序
    Javascript的for...in语句在IE和Firefox的差异
    真实案例:给所有想要创业的朋友的一个管理方面的测试题
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/11401626.html
Copyright © 2011-2022 走看看