事务控制

掌握JDBC完成数据表CURD
掌握DAO模式程序

今天学习重点:JDBC事务管理、数据库连接池技术

事务:一组全部成功、全部失败操作。(这组操作不可分割)
案例:转账案例

MySQL 数据库 默认情况下 一条SQL就是一个单独事务,事务是自动提交的
Oracle 数据库 默认情况下 事务不是自动提交 ,所有SQL都将处于一个事务中,你需要手动进行commit提交/rollback回滚

设计账户table
create table account(
id int primary key not null,
name varchar(40),
money double
);

insert into account values(1,’aaa’,1000);
insert into account values(2,’bbb’,1000);
insert into account values(3,’ccc’,1000);

在mysql管理事务
start transaction 开启事务 (所有对数据表增加、修改、删除操作 临时表进行)
rollback 回滚事务 (取消刚刚操作)
commit 提交事务 (确认刚才操作)
* 在事务管理中执行sql,使用数据库内临时表保存,在没有进行事务提交或者回滚,其它用户无法看到事务操作结果的
* SQL语言中只有 DML才能被事务管理 insert update delete

Oracle实验
create table account(
id int primary key not null,
name varchar(40),
money number
);

使用JDBC程序如何控制事务
Connection.setAutoCommit(false); // 相当于start transaction
Connection.rollback(); rollback — 回滚到事务开启时状态
Connection.commit(); commit

  • 将mysql的jar 复制 WEB-INF/lib
  • 复制之前编写的JDBCUtils工具类
  • 将数据库配置文件 dbconfig.properties 复制 src目录下 —– 修改数据库配置

事务回滚点 SavePoint
* 当时事务特别复杂,有些情况不会回滚到事务最开始状态,需要将事务回滚到指定位置
Savepoint sp = conn.setSavepoint(); 设置回滚点
Conn.rollback(sp); 事务回滚到指定位置

create table person(
id int primary key,
name varchar(40)
);

package it.cast.test;

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

import org.junit.Test;

import it.cast.jdbc.JDBCUtils;

public class TransforTest {
@Test
public void demo2(){
Connection conn=null;
PreparedStatement stmt=null;

       try {
        conn=JDBCUtils.getConnection();
        conn.setAutoCommit(false);//关闭自动提交

        String sql1="update account set money=money-100 where id=2";
        String sql2="update account set money=money+100 where id=3";
        stmt=conn.prepareStatement(sql1);
        stmt.executeUpdate();//执行update操作
        //int d=1/0;
        stmt=conn.prepareStatement(sql2);
        stmt.executeUpdate();//执行update操作
        conn.commit();
       } catch (Exception e) {
        try {
            System.out.println("事务回滚");
            conn.rollback();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }finally{
        JDBCUtils.release(conn, stmt);
    }
}

@Test
public void demo1(){
     Connection conn=null;
       PreparedStatement stmt=null;

       try {
        conn=JDBCUtils.getConnection();
        String sql1="update account set money=money-100 where id=2";
        String sql2="update account set money=money+100 where id=3";
        stmt=conn.prepareStatement(sql1);
        stmt.executeUpdate();//执行update操作

        stmt=conn.prepareStatement(sql2);
        stmt.executeUpdate();//执行update操作
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, stmt);
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值