【青训营】HTML基础 - 语义化标签 - 浏览器渲染过程 - 笔记及拓展

mysql获取字段名,获取注释

  返回  

JDBC之事务案例——转账

2021/8/20 13:31:09 浏览:

事务案例——转账

事务能够控制是否和何时更改应用于数据库,将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,则整个事务将失败

转账问题中转入和转出两个账户的余额变化就是典型的事务案例,一个账户余额增加的同时,另一个转出的账户的余额必然随之减少,这可以看作是一整个事务

根据上述信息创建表money,userid和hold字段分别代表账户id和该id的余额,假设每个账户当前余额都为1000元

在这里插入图片描述


JDBC驱动程序默认使用自动提交模式,每个SQL语句在完成后都会提交到数据库,假设发生了异常,sql语句还是会自动提交

某些业务逻辑需要同时成功or同时失败,因此需要设置手动提交事务,某些业务发生异常后不能进行事务提交,这是事务的意义

转账问题中转入和转出两个账户的余额变化就是典型的事务案例,一个账户余额增加的同时,另一个转出的账户的余额必然随之减少

根据题意编写代码如下:

    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        try {
            //1加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2获得链接
            String userName = "root";
            String passWord = "123456";
            String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT";
            connection = DriverManager.getConnection(url, userName, passWord);
            connection.setAutoCommit(false);//关闭自动提交事务,设置成手动提交事务
            //3定义sql,创建状态通道(进行sql语句的发送)
            statement = connection.createStatement();

            //4执行
            //id为1的账户转出100元
            int result1 = statement.executeUpdate("update money set hold = hold - 100 where userid = 1");
            //id为2的账户收到100元
            int result2 = statement.executeUpdate("update money set hold = hold + 100 where userid = 2");

			/*
			System.out.println(2/0);
			如果程序中加入了上述语句,则在执行过程中会抛出异常
			↓
			执行catch进行回滚,事务result1和result2不执行	
			下面的connection.commit();不执行,即不提交事务

			如果是自动提交事务,则虽然会抛出异常,但事务自动提交,result1和result2依旧会执行
			事务的意义在于某些业务逻辑需要同时成功or同时失败
			*/
            connection.commit();//手动提交事务

            //返回结果为受影响的行数
            if(result1 > 0 && result2 > 0){
                System.out.println("执行成功");
            }else{
                System.out.println("执行失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
                connection.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }finally {
            try {
                //5关闭资源
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }//end main

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号