victory的博客

长安一片月,万户捣衣声

0%

JavaWeb项目开发 | 事务

事务

当我们一次需要执行多条sql语句时就要考虑控制事务以避免出现一些错误。
例如:当我们从一个账户给另一个账户转账时,假设第一个账户的余额已经扣除,此时电脑断电了,
第二个账户的余额也没有增加;为了避免此类事情的发生,我们可以对事物进行控制,要么增扣除和增加都成功,
要么扣除、增加都失败。
创建表user

CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
NAME VARCHAR(20),
balance DOUBLE
);

创建测试类Test1.java

package com.oracle.test;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.oracle.utils.DataSourceUtils;

public class Test1 {

    public static void main(String[] args){
        try {
            //开启事务
            DataSourceUtils.startTransaction();
            //创建QueryRunner对象
            QueryRunner qr = new QueryRunner();
            //编写sql语句
            String sql1 = "update user set balance=balance-500 where id=1";
            String sql2 = "update user set balance=balance+500 where id=2";
            //执行sql
            qr.update(DataSourceUtils.getConnection(), sql1);
            
            //失败
            int c=100/0;
            
            qr.update(DataSourceUtils.getConnection(), sql2);
            //事务提交
            DataSourceUtils.commitAndRelease();
            //关闭事务
            DataSourceUtils.closeConnection();
        } catch (Exception e) {
            //失败则回滚
            try {
                DataSourceUtils.rollback();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }

}