`

JDBC事务处理

    博客分类:
  • Jdbc
阅读更多
1. 事务的概念

事务处理在数据库开发中有着非常重要的作用,所谓事务就是所有的操作要么一起成功,要么一起失败,事务本身具有原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)、持久性(Durability)4个特性,这4个特性也被称为ACID特征。

原子性:原子性是事务最小的单元,是不可再分隔的单元,相当于一个个小的数据库操作,这些操作必须同时成功,如果一个失败了,则一切的操作将全部失败。

一致性:指的是在数据库操作的前后是完全一致的,保证数据的有效性,如果事务正常操作则系统会维持有效性,如果事务出现了错误,则回到最原始状态,也要维持其有效性,这样保证事务开始时和结束时系统处于一致状态。

隔离性:多个事务可以同时进行且彼此之间无法访问,只有当事务完成最终操作时,才可以看到结果。

持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。


2. MySQL对事务的支持

序号 命令 描述
1 SET AUTOCOMMIT=0    取消自动提交处理,开启事务处理
2 SET AUTOCOMMIT=1    打开自动提交处理,关闭事务处理
3 START TRANSACTION    启动事务
4 BEGIN    启动事务,相当于执行 START TRANSACTION
5 COMMIT    提交事务
6 ROLLBACK    回滚全部事务
7 SAVEPOINT 事务保存点名称    设置事务保存点
8 ROLLBACK TO SAVEPOINT 保存点名称    回滚操作到保存点


3. JDBC事务处理

4. 事务保存点

create table t_account (
  id int(11) not null auto_increment,
  accountname varchar(20) default null,
  accountbalance int(11) default null,
  primary key (id)
) engine=innodb auto_increment=3 default charset=utf8;

insert into t_account(id,accountName,accountBalance) values (1,'张三',500),(2,'李四',1000);

Demo01.java

package com.andrew.jdbc.chap09;

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

import com.andrew.jdbc.util.DbUtil;

public class Demo01 {
    private static DbUtil dbUtil = new DbUtil();

    // 转出
    private static void outCount(Connection con, String accountName, int account) throws Exception {
        String sql = "update t_account set accountBalance=accountBalance-? where accountName=?";
        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, account);
        pstmt.setString(2, accountName);
        pstmt.executeUpdate();
    }

    // 转入
    private static void inCount(Connection con, String accountName, int account) throws Exception {
        String sql = "update t_account set accountBalance=accountBalance+? where accountName=?";
        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, account);
        pstmt.setString(2, accountName);
        pstmt.executeUpdate();
    }

    public static void main(String[] args) {
        Connection connection = null;
        try {
            connection = dbUtil.getConnection();
            connection.setAutoCommit(false); // 取消自动提交
            System.out.println("张三开始向李四转账!");
            int account = 500;
            outCount(connection, "张三", account);
            inCount(connection, "李四", account);
            System.out.println("转账成功!");
        } catch (Exception e) {
            try {
                connection.rollback(); // 回滚
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                connection.commit(); // 提交事务
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

张三开始向李四转账!
转账成功!
500 1000 ->
0 1500
如果修改sql语句报错则不能执行


Demo02.java

package com.andrew.jdbc.chap09;

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

import com.andrew.jdbc.util.DbUtil;

public class Demo02 {
    private static DbUtil dbUtil = new DbUtil();

    // 转出
    private static void outCount(Connection con, String accountName, int account) throws Exception {
        String sql = "update t_account set accountBalance=accountBalance-? where accountName=?";
        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, account);
        pstmt.setString(2, accountName);
        pstmt.executeUpdate();
    }

    // 转入
    private static void inCount(Connection con, String accountName, int account) throws Exception {
        String sql = "update t_account set account=accountBalance+? where accountName=?";
        PreparedStatement pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, account);
        pstmt.setString(2, accountName);
        pstmt.executeUpdate();
    }

    public static void main(String[] args) {
        Connection connection = null;
        Savepoint savepoint = null;
        try {
            connection = dbUtil.getConnection();
            connection.setAutoCommit(false); // 取消自动提交
            System.out.println("张三开始向李四转账!");
            int account = 500;
            outCount(connection, "张三", account);
            savepoint = connection.setSavepoint(); // 设置一个保存点
            inCount(connection, "李四", account);
            System.out.println("转账成功!");
        } catch (Exception e) {
            try {
                connection.rollback(savepoint); // 回滚到savepoint保存点
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                connection.commit(); // 提交事务
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:
张三开始向李四转账!
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'account' in 'field list'
500 1000 ->
0 1000
分享到:
评论

相关推荐

    JDBC事务处理机制探秘

    总结起来,JDBC事务适用于简单的单库操作,而JTA事务则适合处理跨多个数据源的复杂事务场景。在J2EE环境中,容器管理的事务(如SessionBean中的JTA事务)能够提供更高的可伸缩性和可靠性。在实际应用中,根据需求...

    JavaBean中使用JDBC方式进行事务处理

    ### JavaBean中使用JDBC方式进行事务处理 #### 一、引言 在现代软件开发过程中,数据一致性是非常关键的一个方面,特别是在涉及到多个数据库操作时。本文将详细介绍如何在JavaBean中利用JDBC(Java Database ...

    JDBC事务处理、提交、回滚。.docx

    1. **JDBC事务的基本概念** - **事务**:事务是数据库系统中执行的一系列操作的集合,这些操作要么全部成功,要么全部失败。事务具有四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)...

    JDBC事务操作例子所需jar包

    在Java中,JDBC事务处理主要涉及以下几个关键概念: 1. **Connection对象**:它是与数据库的会话,通过该对象可以开启、提交和回滚事务。在连接池中获取到的Connection通常已经自动开启了事务,但如果没有,可以...

    Sharding-JDBC分布式事务应用

    Sharding-JDBC是阿里巴巴开源的一款轻量级数据库中间件,它为Java开发者提供了一种透明化的数据分片解决方案,同时也支持分布式事务处理。在现代互联网应用中,面对海量数据和高并发的挑战,分布式事务成为了必不可...

    Java jdbc三层及事务(转账案例)

    本教程将深入探讨Java JDBC中的三层架构(三层架构是指表现层、业务逻辑层和数据访问层)以及事务处理,同时结合具体的转账案例来阐述可能遇到的问题和解决策略。此外,我们还会涉及单例模式和ThreadLocal在实际应用...

    Java(JDBC)事务处理

    Java(JDBC)事务处理

    jdbc连接各数据库及事务处理

    二、JDBC事务处理 在数据库操作中,事务处理确保一组操作要么全部成功,要么全部失败,保证数据的一致性。在JDBC中,我们可以通过以下方式管理事务: 1. 设置自动提交为false:默认情况下,JDBC的每个数据库操作都...

    JDBC事务管理的简单实现

    事务模板是指提供模板方法对事务处理的代码进行控制。事务模板可以简化事务管理的代码,提供了统一的事务管理方法。例如,TransactionTemplate类提供了executeTransaction()方法,用于执行事务回调方法。 五、事务...

    JDBC的事务初探

    **JDBC事务初探** Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准API。在处理数据库操作时,事务管理是确保数据一致性、完整性和持久性的重要机制。本篇将深入探讨JDBC中的事务处理,以及...

    JDBC事务管理.docx

    JDBC事务管理是数据库...总之,JDBC事务管理是确保数据库操作正确性和一致性的关键,通过理解和应用ACID原则以及适当的并发控制机制,开发人员可以有效地处理并发环境下的事务处理,保证系统的稳定性和数据的完整性。

    JDBC事务 JTA事务 传播特性 隔离级别

    在2PC中,事务处理监视器(TPM)先询问所有资源管理器(如数据库)是否准备好提交,然后再决定全局提交或回滚。JTA事务更复杂,但能保证分布式事务的一致性。 最后,我们提到的是**事务的传播特性**,这是Spring...

    事务处理与异常处理全面的讲解

    例如,一个典型的JDBC事务处理代码如下: ```java Connection con = DriverManager.getConnection(); con.setAutoCommit(false); try { // 事务中的操作 con.commit(); } catch (Exception e) { con.rollback(); ...

    spring JDBC事务管理

    **源码分析**:深入理解Spring JDBC事务管理的源码,可以帮助开发者更好地定制和优化事务处理。关键类如`TransactionDefinition`定义了事务属性,如隔离级别、超时时间等;`TransactionStatus`接口则表示当前事务的...

    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc

    JDBC 事务处理是通过 Connection 对象来控制事务的提交和回滚。例如,在 JDBC 中,可以使用 Connection 对象的 setAutoCommit 方法来禁用自动事务提交,然后使用 commit 方法来提交事务,或者使用 rollback 方法来回...

    JDBC事物应用源码文件

    通过`jdbc_demo`这样的源码文件,开发者可以学习到如何在实际项目中使用这些概念,从而更好地理解和掌握JDBC事务处理。实践中,开发者可以参考这些示例代码,结合具体的业务需求,编写自己的事务管理逻辑。

    JDBC事务控制--讲述如何控制JDBC事务

    ### JDBC事务控制详解 在数据库应用开发中,事务管理是一项重要的功能,它确保了一系列操作能够作为一个整体被正确地执行或回滚。Java Database Connectivity (JDBC) 是 Java 平台中用于连接数据库的标准 API,提供...

    JDBC事务管理项目

    这不利于事务处理,因为无法控制何时提交或回滚事务。 2. **手动提交模式**:通过调用`Connection`对象的`setAutoCommit(false)`方法,可以关闭自动提交,从而开始手动事务管理。在手动模式下,需要显式调用`commit...

    JDBC教程

    JDBC事务处理 JDBC支持事务管理,可以控制一组数据库操作作为一个原子单元。通过设置Connection的自动提交属性(`conn.setAutoCommit(false)`)来开启手动事务,并使用`commit()`和`rollback()`方法提交或回滚事务...

Global site tag (gtag.js) - Google Analytics