zoukankan      html  css  js  c++  java
  • jdbc 事物 commit 和rollback方法

    package transaction;
    
    import jdbc.utils.*;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    /*
     * 1.一个事物里的操作要么都执行,要么都不执行
     *   事物:一个或多个DML操作
     * 2.事物处理原则:所有操作都完成时被commit,使修改永久保存
     *                 反之放弃所有操作,事物rollback到最初状态
     * 3.提交后就不可回滚
     * 4.DDL一旦执行,就会自动提交
     * 5.DML默认自动提交,但是可以set autocommit = false 进行设置
     * 6.默认在关闭连接时会自动提交数据
     * */
    public class TransactionTest {
        
        
        public static int update(Connection con,String sql,Object...args) {
            PreparedStatement ps = null;
            try {
                ps=con.prepareStatement(sql);
                for(int i=0;i<args.length;i++)
                    ps.setObject(i+1, args[i]);
                return ps.executeUpdate();
            }
            catch(Exception ex) {
                ex.printStackTrace();
                
            }
            finally {
                JDBCUtils.closeResource(null, ps);
            }
            return 0;
        }
        
        //要保证几个DML操作作为一个整体出现,要么都做,要么都不做
        public static void testUpdateWithTx() {
            Connection con = null;
            try {
                con = JDBCUtils.getConnection();
                System.out.println(con.getAutoCommit());
                //取消数据的自动提交来对应中间的异常
                con.setAutoCommit(false);
                
                String sql = "update blank set money = money-100 where blankId = ?";
                update(con,sql,0);
                
                //System.out.println(10/0);//模拟网络异常
                
                sql = "update blank set money = money+100 where blankId = ?";
                update(con,sql,1);
                
                System.out.println("转账成功");
                con.commit();
            }
            catch(Exception ex) {//出现异常就必须rollback
                ex.printStackTrace();
                try {
                    con.rollback();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            finally {
                try {//最后要把这个连接进行还原,再返回到数据库的连接池里去
                    con.setAutoCommit(true);
                }
                catch(SQLException e) {
                    e.printStackTrace();
                }
                JDBCUtils.closeResource(con, null);
            }
        }
        public static void main(String []args) {
            testUpdateWithTx();
        }
    }

    1

  • 相关阅读:
    pl/sql 编程!
    oracle中的常用函数、字符串函数、数值类型函数、日期函数,聚合函数。
    oracle 相关查询和非相关查询,oracle 去除重复数据,以及oracle的分页查询!
    初识 oracle!
    分页查询。
    利用ajax技术 实现用户注册。
    quartz CronExpression
    SQL 面试题
    什么是HTTP协议?常用的状态码有哪些?
    聚集索引与非聚集索引
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11855133.html
Copyright © 2011-2022 走看看