zoukankan      html  css  js  c++  java
  • jdbc 事物

    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

  • 相关阅读:
    Linux入门-ssh scp rsync
    Linux入门-samba
    Linux入门-vsftp
    Linux入门-nfs
    MySQL卸载(rpm)
    rust_3_所有权
    rust_1_入门指南与猜猜看游戏
    vscode首次ssh remote linux连不上
    vbox新装ubuntu虚拟机注意事项
    IBM Rational Rose和Start UML的c++逆向工程自动生成UML类图组件
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11852073.html
Copyright © 2011-2022 走看看