JDBC事务

Posted zs0322

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC事务相关的知识,希望对你有一定的参考价值。

summarize

事务开启后:只有两条路,要么回滚,要么提交。cmd里面显示的都是在内存里,并没有真正进入表,如果想写进表里,commit ;  就等于是写入表内。

 

一、事务概述

1.什么是事务

一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败

就是将n个组成单元放到一个事务中

2.mysql的事务

默认的事务:一条sql语句就是一个事务 默认就开启事务并提交事务

手动事务:

1)显示的开启一个事务:start transaction

2)事务提交:commit代表从开启事务到事务提交 中间的所有的sql都认为有效   真正的更新数据库

3)事务的回滚:rollback 代表事务的回滚 从开启事务到事务回滚 中间的所有的   sql操作都认为无效数据库没有被更新

开启事务后  技术图片

查询的所有命令都只是写在内存里,只有 commit后 才会写入表内,rollback相当于 清屏

一、JDBC事务操作

默认是自动事务:

执行sql语句:executeUpdate()  ---- 每执行一次executeUpdate方法 代表     事务自动提交

通过jdbc的API手动事务:

开启事务:conn.setAutoComnmit(false);(默认是true)

提交事务:conn.commit();

回滚事务:conn.rollback();

注意:控制事务的connnection必须是同一个

执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制

 

建个Java项目  导包

技术图片

package com.oracle.demo01;
//事务
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import com.oracle.tools.JDBCUtils;

public class Demo01 
    public static void main(String[] args) 
//        获取连接
        Connection conn=JDBCUtils.getConn();
        Statement sta=null;
        String sql="insert into account(aname,money) values(‘wangwu‘,1000)";
        try 
            sta=conn.createStatement();//用statement 直接可以传值,不用占位
//            执行SQL前 手动开启事务
            conn.setAutoCommit(false);//手动开启设置
            sta.executeUpdate(sql);
         catch (SQLException e) 
//            回滚
            try 
                conn.rollback();
             catch (SQLException e1) 
                // TODO Auto-generated catch block
                e1.printStackTrace();
            
            // TODO Auto-generated catch block
            e.printStackTrace();
        finally
//            提交
            try 
                conn.commit();
             catch (SQLException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        
    

一、DBUtils事务操作

1.QueryRunner

有参构造:QueryRunner runner = new QueryRunner(DataSource dataSource);

有参构造将数据源(连接池)作为参数传入QueryRunner,QueryRunner会从连      接池中获得一个数据库连接资源操作数据库,所以直接使用无Connection参数  的update方法即可操作数据库

无参构造:QueryRunner runner = new QueryRunner();

无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使   用QueryRunner对象操作数据库时要使用有Connection参数的方法

代码 展示

新建个tool

package com.oracle.tools;

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

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class MyDBUtils 
    public static final String DRIVER = "com.mysql.jdbc.Driver";
    public static final String URL = "jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "123456";
    /*
     * 创建连接池BasicDataSource
     */
    public static BasicDataSource dataSource = new BasicDataSource();
    //静态代码块
    static 
        //对连接池对象 进行基本的配置
        dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
        dataSource.setUrl(URL); //指定要连接的数据库地址
        dataSource.setUsername(USERNAME); //指定要连接数据的用户名
        dataSource.setPassword(PASSWORD); //指定要连接数据的密码
    
    /*
     * 返回连接池对象
     */
    public static DataSource getDataSource()
        return dataSource;        
    
    
//    返回一个连接对象
    public static Connection getConn()
        Connection conn=null;
        try 
            conn=dataSource.getConnection();
         catch (SQLException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        return conn;
    

--------------------------------------------------
package com.oracle.demo01;
//无参构造QueryRunner 事务
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.oracle.tools.MyDBUtils;

public class Demo02 
    public static void main(String[] args) 
//        创建queryrunner对象
        QueryRunner qr=new QueryRunner();
//        获取连接对象
        Connection conn=MyDBUtils.getConn();
        String sql="update account set money=money-? where aname=?";
        try 
//            开启事务
            conn.setAutoCommit(false);//手动开启
            qr.update(conn,sql,100,"zhangsan");//更改-100
         catch (SQLException e) 
//            回滚事务 
            try 
                conn.rollback();//把回滚写到try里面,上面代码已有错误就会自动回到开启事务
             catch (SQLException e1) 
                // TODO Auto-generated catch block
                e1.printStackTrace();
            
            // TODO Auto-generated catch block
            e.printStackTrace();
        finally //不管对错,上面代码只要是对的,在这里就会执行
//            提交事务
            try 
                conn.commit();
             catch (SQLException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
                
        

做个转账项目

建个dynamic 

导包技术图片 技术图片

 

以上是关于JDBC事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA无法提交jdbc事务的解决办法

JDBC_事务_小结!

事务的学习,从jdbc开始:jdbc对事务的支持与实现

JDBC_事务说明

JavaWeb5.6JDBC:JDBC控制事务转账案例

事务种类jdbc,Hibernate,JTA事务