事务

简介: 事务概念事务是指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果一个操作失败,整个操作就回滚。事务ACID特性原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

事务概念

事务是指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果一个操作失败,整个操作就回滚。
事务ACID特性

  • 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  • 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  • 持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

核心api

|-- Connection
void setAutoCommit(boolean autoCommit) ;  设置事务是否自动提交
                                      如果设置为false,表示手动提交事务。
void commit() ();       手动提交事务
void rollback() ;       回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)

案例(张三给李四转账)

  • 代码
package cn.persistXl.app;

import cn.persistXl.util.JdbcUtil;
import org.junit.Test;

import java.sql.*;

/**
 * @author persistXL
 * @data 2018/4/30 20:25
 */
public class AccountDao {
    //全局参数
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    //转账,没有使用事物

    public void trans() {

        //准备sql
        String sql_zs = "";
        String sql_ls = "";

        try {

            //获取连接
            conn = JdbcUtil.getConnection();
            //使用默认开启的隐士事物

            /**
             * 第一次执行sql
             */
            //预编译sql
            pstmt = conn.prepareStatement(sql_zs);
            //设置参数
            //执行sql
            pstmt.executeUpdate();

            /**
             * 第二次执行sql
             */
            //预编译sql
            pstmt = conn.prepareStatement(sql_ls);
            //设置参数
            //执行sql
            pstmt.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtil.close(conn,pstmt,null);
        }
    }
    //使用事物
    public void trans1(){
        //准备sql
        String sql_zs = "";
        String sql_ls = "";

        try {

            //获取连接
            conn = JdbcUtil.getConnection();

            //设置事物为手动提交

            conn.setAutoCommit(false);

            /**
             * 第一次执行sql
             */
            //预编译sql
            pstmt = conn.prepareStatement(sql_zs);
            //设置参数
            //执行sql
            pstmt.executeUpdate();

            /**
             * 第二次执行sql
             */
            //预编译sql
            pstmt = conn.prepareStatement(sql_ls);
            //设置参数
            //执行sql
            pstmt.executeUpdate();

        } catch (Exception e) {
            try {
                // 出现异常需要回滚事物
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                //所有操作执行成功,提交事物
                conn.commit();
                JdbcUtil.close(conn,pstmt,null);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    //使用事物,回滚到指定的代码段
    
    public void trans2() {

        Savepoint sp = null;
        //准备sql
        String sql_zs1 = "";
        String sql_ls1 = "";
        String sql_zs2 = "";
        String sql_ls2 = "";

        try {

            //获取连接
            conn = JdbcUtil.getConnection();
            conn.setAutoCommit(false);

/*** 第一次转账 */


            /**
             * 第一次执行sql
             */
            //预编译sql

            pstmt = conn.prepareStatement(sql_zs1);
            //执行sql

            pstmt.executeUpdate();

            /**
             * 第二次执行sql
             */
            //预编译sql

            pstmt = conn.prepareStatement(sql_ls1);
            //执行sql

            pstmt.executeUpdate();

            //回滚到这个位置
            sp = conn.setSavepoint("trans");

/*** 第二次转账 */

            pstmt = conn.prepareStatement(sql_zs2);
            pstmt.executeUpdate();
            pstmt = conn.prepareStatement(sql_ls2);
            pstmt.executeUpdate();

        } catch (Exception e) {
            try {
                //回滚到指定位置
                conn.rollback(sp);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JdbcUtil.close(conn,pstmt,null);
        }
    }
}

相关文章
|
3月前
|
SQL 关系型数据库 MySQL
事务及事务的隔离级别
事务及事务的隔离级别
|
4月前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
24 0
|
3月前
|
数据库
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交 查询事务默认提交方式 1=自动,0=手动 SELECT @@autocommit 修改默认提交 set@@autocommit =xx 事务的四大特征 1.原子性:是不可分割的最小操作单位,要么同时成功,要么失败 2.持久性:当事务提交或回滚后,数据库会持久化的保存数据 3.隔离性:多个事务之间。相互独立 4.一致性:事务操作前后,数据总量不变
23 4
|
3月前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
34 0
|
2月前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
9 0
|
4月前
|
SQL 前端开发 大数据
什么是大事务?以及大事务产生的问题
什么是大事务?以及大事务产生的问题
73 0
|
8月前
|
人工智能 关系型数据库 MySQL
事务详解
事务是逻辑上的一组操作,要么都执行,要么都不执行。
46 0
|
11月前
|
数据库
什么时候需要使用事务
什么时候需要使用事务
352 0
|
存储 Oracle 固态存储
深入理解事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑执行单元。即事务中的所有读写是一个执行的整体,整 个事务要么成功(提交)、要么失败(中止 或者 回滚)。如果失败,应用程序可以安全地重试。
16389 0
深入理解事务
|
SQL Java 大数据
事务详解(2)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
150 1