数据库事务的详解

news/2024/9/19 2:36:31 标签: 数据库, sql

1、 介绍

什么是事务?

事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。(一组操作同时成功,或同时失败)


场景:

银行转账操作,A账号要给B账户转钱. A原有1000块,B原有1000块.A转账给B 100元

A的钱要减少,B的钱要增多

update A set money = money - 100 where id = a
​
-- 服务器出现异常,导致后面的sql没有执行
​
update B set money = money + 100 where id = b

2、 mysql中事务

  • 目前使用的mysql支持事务操作

  • mysql中的事务是每个sql语句都是单独事务,且自动提交事务的

    • 通过命令查询当前事务的提交方式 SHOW VARIABLES like 'autocommit'

    • 通过命令设置自动提交关闭 set autocommit = off / 或者= 0 关

    • set autocommit = on / 或者= 1 开

  • 事务的操作

    • 开启事务 start transaction 或者 begin

    • 提交事务 commit

    • 回滚事务 rollback

3、 演示事务

sql">准备数据

CREATE TABLE `account` (
 `id` int(50) NOT NULL,
 `name` varchar(50) NOT NULL,
 `money` int(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO account VALUES(1,'张三',1000);
INSERT INTO account VALUES(2,'李四',1000);
-- =============================================
-- 开启事务
start transaction;
-- 开始转账
update account set money = money - 100 where id = 1
-- 出大事了,后面执行不了
update account set money = money + 100 where id = 2
-- 如果一切正常,提交事务
commit;
-- 服务器出现异常,要回滚
rollback;
-- 查询当前事务提交方式
SHOW VARIABLES  like 'autocommit';
-- 手动控制事务,自动提交关闭
set autocommit = off;
​
-- ============= java 伪代码 ==================
try{
 conn.setAutocommit(false); -- 自动提交,开启手动事务
 conn.execute("update ....")
 System.out.print(1/0)
 conn.execute("update ....")
 conn.commit();   -- 提交
}catch(Exception e) { -- 如果有异常
 conn.rollback();  -- 回滚
}
​
-- 后面学框架,只需要配置一下就ok,一个注解搞定

4、 事务特性

事务的特性(ACID)

  • 原子性(Atomicity):指事务的整个操作是一个整体,要么都成功,要么都失败

  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。

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

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

image-20230508161105254

5、 事务的隔离机制

数据库有不同的隔离机制/隔离级别

  1. 读未提交-READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。

  2. 读已提交-READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。

    (oracle 默认的)

  3. 可重复读-REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。

    (mysql 默认),行锁

  4. 串行化-SERIALIZABLE: 避免赃读、不可重复读、虚读。

    串行化,其实是表锁

查看当前数据库的隔离级别: SELECT @@TX_ISOLATION;

更改当前的事务隔离级别:

SET [glogal | session] TRANSACTION ISOLATION LEVEL 四个级别之一。

赃读:指一个事务读取了另一个事务未提交的数据。

对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段.  之后, 若 T2 回滚, T1读取的内容就是临时且无效的.  

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。(update)

对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段.  之后, T1再次读取同一个字段, 值就不同了.  

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。 (insert)

对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中  插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行

总结一些常用的问题

1 什么是事务
2 mysql事务怎么操作(开启,提交,回滚)
3 事务什么特点(ACID)
4 什么是事务隔离(能解释)
5 有哪些级别,简单解释
6 mysql默认什么级别

http://www.niftyadmin.cn/n/5664892.html

相关文章

英飞凌PSoC4000T示例工程

关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:

继承1 2024_9_18

1.继承的基本用法 当需要继承的时候,我们就在派生类的后面加上一个权限父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了. 2.继承基类成员访问方式的变化 当父类被继承到派生类的时候,此时会根据继承方式的不…

【算法竞赛】队列

队列相关概念 队列中的数据存取方式是“先进先出”,只能向队尾插入数据,从队头移出数据. 队列的原型在生活中很常见,如食堂打饭的队伍,先到先服务.队列有两种实现方式:链队列和循环队列,如图1.2所示. 链队列可以看作单链表的一种特殊情况,用指针把各个节点连接起来. 循环队…

QCustomPlot笔记(一)

文章目录 简介将帮助文档添加到Qt Creator中编译共享库cmake工程编译提示ui_mainwindow.h找不到qcustomplot.h文件 环境:windowsQt Creator 10.0.1cmake 简介 QT中用于绘制曲线的第三方工具 下载地址:https://www.qcustomplot.com/index.php/download 第一个压缩…

一、Numpy入门

Numpy入门 前言一、numpy简介二、Numpy的ndarray属性2.1. 直接用 .属性的方法实现2.2. 直接函数的方法实现 三、Numpy的ndarray的创建3.1. ndarray介绍3.2. 数组形式3.3. zeros()、ones() 、 empty()3.4. arange(),类似 python 的 range() ,创建一个一维…

特价电影票对接接口平台推荐?微客云影票

特价电影票对接接口平台推荐 一、常见的较好平台 微客云影票与全国 12000 多家影院建立了合作,覆盖范围广,其提供的电影票价格普遍低于市场价,平均每张票能省下不少钱,在万达、CGV 等大型影院优惠更为显著。 二、判断平台好坏的…

为什么你的下一个项目应该使用 NextJS 而不是 React?

当我第一次涉足 Web 开发世界时,我被 React 的强大功能和多功能性所吸引。 作为最受欢迎的库之一,它似乎是构建动态用户界面的首选。 然而,随着我的项目变得越来越复杂,我发现自己面临着挑战我的效率和可扩展性的限制。 就在那…

【七篇文章从零速通transformer】01 从零开始解密神经网络:深度学习基础全解析

文章简介 本系列文章旨在帮助零基础的读者系统地掌握深度学习,最终能够理解 Transformer 架构。本篇文章是第一篇,我们将从深度学习最核心的知识——神经网络——开始讲解,深入浅出地带你了解神经网络的结构、如何让神经网络工作,激活函数、损失函数、优化器和反向传播等关…