day021 事务

1 事务概述

事务的概述.png

2 转账案例的实现

2.1 mysql操作事务(了解)

sqlyog会让事务失效,所以试验的时候得用控制台。

sql语句

描述

start transaction;

开启事务

commit;

提交事务

rollback;

回滚事务

mysql事务是默认自动提交。

扩展:Oracle数据库事务不自动提交。

2.2 jdbc操作事务

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import cn.itcast.c3p0utils.C3P0Utils;

/*
    使用jdbc完成转账案例。
    
    我们要把加钱和减钱看成是同一组操作,这组操作要么都成功,要么都失败。
    可以使用事务去解决这个问题。
    
    步骤:
        转账之前开启事务。
        如果整个过程没有出现问题,那么就提交事务。
        如果整个过程出现了问题,那么就回滚。
    
    如果使用jdbc操作事务,需要使用连接(Connection)对象去操作事务。
    void setAutoCommit(boolean autoCommit):如果传递false,就是设置事务手动提交。也就是开启了事务。
    void commit():提交事务
    void rollback(): 回滚事物。
 
    
    
 */
public class Demo01JDBCTransaction {
    public static void main(String[] args) {
        Connection con = null;
        try {
            // 使用工具类获取一个连接
            con = C3P0Utils.getConnection();
            //通过连接获取到sql语句执行者对象
            Statement st = con.createStatement();
            
            //在sql语句执行前开启事务,保证后面的所有的sql语句都是同一组操作。
            con.setAutoCommit(false);//false表示手动提交事务,也就是开启了事务
            
            //执行sql语句
            //先给jack的钱减去100
            int row1 = st.executeUpdate("UPDATE account SET money=money-100 WHERE name='jack'");
            System.out.println("row1:" + row1);
            
            //模拟停电
            System.out.println(10 / 0);
            
            //给rose的钱加上100
            int row2 = st.executeUpdate("UPDATE account SET money=money+100 WHERE name='rose'");
            System.out.println("row2: " + row2);
            
            //如果没有问题,就提交事务
            con.commit();
            System.out.println("转账成功");
        } catch (Exception e) {
            //如果转账过程出现问题,catch会捕获到这个异常,那么我们就在catch回滚事物
            try {
                if(con != null) {//非空判断,让程序更加的健壮(鲁棒)
                    con.rollback();
                    System.out.println("转账失败");
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        
    }
}

2.3 dbutils操作事务

 

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import cn.itcast.c3p0utils.C3P0Utils;

/*
    使用DBUtils完成转账案例。
    
    需要把加钱和减钱看成一组操作,要么都成功要么都失败。
    还得用事务。
    
    DBUtils操作事务也是通过连接(Connection)对象去操作。
    DBUtils里面的QueryRunner在创建对象的时候一定要使用空参构造去创建对象。(因为另一种拿不到连接,没有连接就操作不了事务)
    
    开启事物,提交事务,回滚事物和jdbc的操作是一样的。
    
    步骤:
        1. 创建QueryRunner对象(使用空参构造创建对象)
        2. 获取到一个连接。
        3. 使用这个连接开启事务。
        4. 执行转账的sql语句。
        5. 如果整个过程没有遇到问题,那么就提交。
                如果整个过程遇到了问题,那么就回滚。
    
 */
public class Demo01DBUtilsTransaction {
    public static void main(String[] args) {
        Connection con = null;
        try {
            //创建QueryRunner对象(使用空参构造创建对象)
            QueryRunner qr = new QueryRunner();
            //获取到一个连接。
            con = C3P0Utils.getConnection();
            //使用这个连接开启事务。
            con.setAutoCommit(false);
            //执行转账的sql语句。
            String sqlA = "UPDATE account SET money=money-100 WH
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值