JDBC-操作事务简单程序

11 篇文章 0 订阅

JDBC操作事务简单程序

事务:要么都成功,要么都不成功,它有ACID原则。

  • 原子性:要么全部执行,要么都不执行。
  • 一致性:总数不变。
  • 隔离性:多个事务之间互不干扰。
  • 持久性:一旦提交就不可逆。

还是先准备好数据库:

-- 选择数据库
USE `test02`;

-- 建表
CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(30) NOT NULL COMMENT '用户名',
  `money` decimal(6,2) NOT NULL COMMENT '账户余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入数据
insert  into `account`(`id`,`username`,`money`) 
values 	(1,'xiaoming','1000.00'),
	(2,'xiaohong','800.00');

我们就用Java程序来实现xiaoming给xiaohong转账的事务操作。
直接上Java代码:

封装的简单JDBCUtils类

package cn.ara;

import java.sql.*;

public class JDBCUtils {
    private static String url = "jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf8&useSSL=true";
    private static String username = "root";
    private static String password = "rootroot";

    //获取数据库连接对象
    public static Connection getConnection(){
        Connection connection = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            try {
                connection = DriverManager.getConnection(url, username, password);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return connection;
    }

    //释放资源
    public static void close(Connection connection, Statement statement, ResultSet resultSet){

        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

事务操作类:

package cn.ara;

import java.sql.*;

//简单JDBC程序操作事务
public class JdbcDemo02 {
    public static void main(String[] args) {
        //连接对象
        Connection connection = null;

        //执行预处理sql语句的对象
        PreparedStatement preparedStatement = null;
        try {
            connection = JDBCUtils.getConnection();

            //关闭自动提交 开启事务
            connection.setAutoCommit(false);

            //xiaoming账户扣除200
            String sql1 = "update account set money = money - ? where username = ?";
            preparedStatement = connection.prepareStatement(sql1);
            preparedStatement.setInt(1,200);
            preparedStatement.setString(2,"xiaoming");
            preparedStatement.executeUpdate();

            //错误
            int a = 1/0;

            //xiaohong账户扣除200
            String sql2 = "update account set money = money + ? where username = ?";
            preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.setInt(1,200);
            preparedStatement.setString(2,"xiaohong");
            preparedStatement.executeUpdate();

            //业务结束,提交事务
            connection.commit();
            System.out.println("操作成功,已提交");

        } catch (SQLException e) {
            try {
                //如果失败就回滚事务(这里的回滚可以不用显示定义,事务失败就会默认回滚)
                connection.rollback();
                System.out.println("操作失败,已回滚");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //释放资源
            JDBCUtils.close(connection,preparedStatement,null);
        }
    }
}

我在程序中事务执行里面加了一条错误语句,就这样执行,事务是失败的,两个账户的余额都不会发生更改,事务在出错的时候,我们使用了try catch语句,错误就回滚,执行全部完成后再提交。当去除错误,我们发现就会转账成功,对应数据库表中也会发生变化。

以上就是Java操作事务的简单应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值