当前位置: 首页 > news >正文

数据库事务的详解

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、 演示事务

准备数据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默认什么级别

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Apache Cordova开发教程-入门基础
  • eth-trunk 笔记
  • 电源模块启动过冲测试项目该如何在ATECLOUD中搭建?
  • a√斗地主之顺子
  • 传输层协议——udp/tcp
  • STL,智能指针和线程安全,线程安全的单例模式和懒汉饿汉的实现,以及读者写者问题
  • 如何用 Helm Chart 安装指定版本的 GitLab Runner?
  • 安卓手机安装Termux,变成linux服务器
  • Python 数学建模——Pearson/Spearman 相关系数
  • linux高级
  • 磁光阱的原理与搭建操作
  • 海康威视相机在QTcreate上的使用教程
  • pycharm 安装对应python版本的pip
  • Linux C高级 day1
  • SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 5、React组件事件详解
  • Android 架构优化~MVP 架构改造
  • android图片蒙层
  • Angular 响应式表单 基础例子
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • in typeof instanceof ===这些运算符有什么作用
  • java8 Stream Pipelines 浅析
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL用户中的%到底包不包括localhost?
  • Node项目之评分系统(二)- 数据库设计
  • python3 使用 asyncio 代替线程
  • rc-form之最单纯情况
  • 对超线程几个不同角度的解释
  • 多线程事务回滚
  • 二维平面内的碰撞检测【一】
  • 关于字符编码你应该知道的事情
  • 猴子数据域名防封接口降低小说被封的风险
  • 近期前端发展计划
  • 聊聊flink的BlobWriter
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何进阶一名有竞争力的程序员?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 如何用纯 CSS 创作一个货车 loader
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ‌JavaScript 数据类型转换
  • !$boo在php中什么意思,php前戏
  • # wps必须要登录激活才能使用吗?
  • # 数论-逆元
  • #控制台大学课堂点名问题_课堂随机点名
  • $(function(){})与(function($){....})(jQuery)的区别
  • (~_~)
  • (1)svelte 教程:hello world
  • (C)一些题4
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (day 12)JavaScript学习笔记(数组3)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (web自动化测试+python)1
  • (八)c52学习之旅-中断实验
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释