数据库事务

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 数据库事务

1 概述

数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。

事务是一个不可分割的工作逻辑单元。

我们通过下图来理解

我们现在希望把所有的书籍都降价8元,但是我们不知道我们处理完了之后,我们的目的达成了没有,是否只有一部分书籍降价成功了,一部分没有,如果我们要求的是,没有全部都降价正确的话,那就集体不讲价,这个像不像我们一般安装软件,如果中途有一个步骤停止了,那么就直接rollback,下次安装的时候从头开始,之前的一切操作都无效。

从上图可以看到在批量处理前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。

4.2 语法

  • 开启事务
START TRANSACTION;
或者  
BEGIN;
  • 提交事务
commit;
  • 回滚事务
rollback;

4.3 代码验证

  • 环境准备
DROP TABLE IF EXISTS account;
-- 创建账户表
CREATE TABLE book(
  recID int PRIMARY KEY auto_increment,
  title varchar(10),
  type varchar(20),
  price double(10,2)
);
-- 添加数据
INSERT INTO bookt(titile,type,price) values
('Java Programming','Computer',36.0),
('Java EE Technology','Computer',49.0),
('Information System','Computer',49.0)
;
  • 不加事务演示问题
-- 降价操作
UPDATE book set price = price - 8 where recID = 1;
UPDATE book set price = price - 8 where recID = 2;
UPDATE book set price = price - 8 where recID = 3; 
  • 如果有一句sql语句出错了,我们也不知道,然后错了就错了,就像我们安装软件一样,如果中途我们因为啥啥啥原因,安装失误了,然后我们重新安装,很多事情都需要重新做一次,但是之前的操作又没有撤回,这个时候很多操作会重复做很多很多次,然后就g了。
  • 添加事务sql如下:
-- 开启事务
BEGIN;
UPDATE book set price = price - 8 where recID = 1;
UPDATE book set price = price - 8 where recID = 2;
UPDATE book set price = price - 8 where recID = 3; 
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
  • 上面sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。以后我们肯定不可能这样操作,而是在java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。

4 事务的四大特征

  • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
  • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolation) :多个事务之间,操作的可见性
  • 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

说明:

mysql中事务是自动提交的。

也就是说我们不添加事务执行sql语句,语句执行完毕会自动的提交事务。

可以通过下面语句查询默认提交方式:

SELECT @@autocommit;

查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式

set @@autocommit = 0;

演示代码

package com.study.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
 * JDBC快速入门
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2. 获取连接
        // String url = "jdbc:mysql://127.0.0.1:3306/books"; // 如果是mysql5这样写
        String url = "jdbc:mysql://localhost:3306/books?serverTimezone=GMT%2B8&useOldAliasMetadataBehavior=true"; // 如果是mysql8这样写
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql1 = "update book set price = price - 8 where reclD = 1";
        String sql2 = "update book set price = price - 8 where reclD = 2";
        String sql3 = "update book set price = price - 8 where reclD = 3";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        try {
            // ============开启事务==========
            conn.setAutoCommit(false); // 加上这几句之后 如果发生异常就会回滚 然后数据不会发生改变
            // 如果没有发生异常 但是发现数据库里面的数据没有改变
            // 可以把这里改成true 不改的话内存里面的数据改了 但是显示的没有改
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 处理结果
            System.out.println(count1);
            int i = 3/0;
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            //6. 处理结果
            System.out.println(count2);
            //5. 执行sql
            int count3 = stmt.executeUpdate(sql3);//受影响的行数
            //6. 处理结果
            System.out.println(count3);
            // ============提交事务==========
            //程序运行到此处,说明没有出现任何问题,则需求提交事务
            conn.commit();
        } catch (Exception e) {
            // ============回滚事务==========
            //程序在出现异常时会执行到这个地方,此时就需要回滚事务
            conn.rollback();
            e.printStackTrace();
        }
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

运行结果:

在上述代码运行过程中,发生了异常,然后使用事物处理的话,那么在此之前的一切修改都会撤销。

内容没有变。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 数据库
事务隔离级别:保障数据库并发事务的一致性与性能
事务隔离级别:保障数据库并发事务的一致性与性能
|
1月前
|
算法 大数据 数据库
数据库事务:保障数据一致性的基石
数据库事务:保障数据一致性的基石
|
4月前
|
存储 SQL 关系型数据库
认识数据库中的事务机制
认识数据库中的事务机制
19 0
|
4月前
|
SQL 存储 关系型数据库
认识数据库中的事务机制(2)
认识数据库中的事务机制(2)。
37 0
|
4月前
|
监控 NoSQL Java
Redis数据库 | 事务、持久化
Redis数据库 | 事务、持久化
28 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】4、MySQL 事务学习
【MySQL 数据库】4、MySQL 事务学习
44 0
|
24天前
|
程序员 数据库
数据库事务详解2
数据库事务详解
19 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL 数据库系列(五)-----索引、事务与存储引擎(Linux版)
MySQL 数据库系列(五)-----索引、事务与存储引擎(Linux版)
28 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql高可用,索引,事务与调优:提高数据库性能的关键技术
在当今互联网时代,高可用性、稳定性和性能是数据库的三大关键要素。本文将深入探讨Mysql高可用、索引、事务和调优等方面的技术,为读者提供实用的解决方案和经验。
24 0
|
3月前
|
数据库 开发工具 Python
请解释一下云数据库的读写一致性和事务支持。
请解释一下云数据库的读写一致性和事务支持。
24 0

热门文章

最新文章