MySQL事务与隔离级别的使用基础理论
作者:绿仔牛奶_ 发布时间:2024-01-23 20:14:49
什么是事务
事务就是一组操作的集合,事务将整组操作作为一个整体,共同提交或者共同撤销
这些操作只能同时成功或者同时失败,成功即可提交事务,失败就执行事务回滚
MySQL的事务默认是自动提交的,一条语句执行成功,MySQL将会隐式的提交事务
以转账为例,张三向李四转账1000元
这个整体行为包含三个操作:首先查询张三账户的余额,其次将张三账户余额-1000,最后将李四账户余额+1000。事务就是将这三个操作看作最小提交单元,就是一荣俱荣一损俱损。
-- 查看事务管理状态 1-自动 0-手动
select @@autocommit;
-- 设置事务手动管理
set @@autocommit = 0;
-- 开启事务
start transaction;
-- 开启事务:start transaction 或者 begin
select money from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
-- 事务提交
commit;
-- 事务回滚
rollback;
事务四大特性ACID
原子性Atomicity:一组操作为最小执行单元,只能全部执行成功或者全部失败
一致性Consistency:事务完成后,所有数据都要保持一致状态
一致性表示事务完成后,数据操作前后符合逻辑运算,状态一致
隔离性Isolation:是指在并发操作数据库时,各个事务之间不会相互影响
持久性Durability:事务一旦提交或回滚,对于数据库的修改将会永久保存
并发事务问题
脏读
两个事务A和B在并发下操作数据库中的同一数据时,当事务A对数据进行了修改但是还没有commit的同时,事务B对该数据进行了select,此时事务B读取到的数据就是不准确的。这种情况叫做脏读
事务B读取到了事务A修改但还未提交的数据---->脏读
不可重复读
同样事务AB并发下操作数据库中同一数据,首先事务A对该数据进行查询,查询之后又进行了其他操作。与此同时,事务B执行了更新操作并且成功commit。那么当事务A再次对数据库查询的时候就会出现与上次读取到的数据不一致的情况
幻读
事务AB并发下操作数据库中同一数据,事务A首先查询了数据库中是否有id=1的数据,没有就插入。那么此时事务A未查询到该数据存在,同时事务B执行了插入操作插入了id=1的数据并且提交。那么事务A再去插入的时候则会报主键冲突的错误,但是当事务A再一次去查的时候发现id=1的数据仍然是不存在( 前提是已经解决了不可重复读的问题,一个事务多次访问同一数据的结果是一致的 ),这种情况就称之为幻读
事务隔离级别
隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted(读未提交) | × | × | × |
Read committed(oracle默认)(读已提交) | √ | × | × |
Repeatable Read(mysql默认)(可重复读) | √ | √ | × |
Serializable(可序化) | √ | √ | √ |
× --> 无法解决 √ --> 可以解决
在sql中查看当前事务隔离级别
select @@transaction_isolation;
设置当前事务隔离级别
-- 设置事务隔离级别
set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};
session是指尽在当前会话中使用该事务隔离级别,global表示全局有效
四种事务隔离级别当中,Serializable可序化级别最高。要求序列化执行sql指令,事务只能一个接一个的执行,不允许并发执行。性能低下
而Read Uncommitted读未提交性能最好,但是存在脏读问题等
来源:https://blog.csdn.net/yuqu1028/article/details/128996305


猜你喜欢
- #/bin/sh #检测mysql server是否正常提供服务 mysqladmin -u sky -ppwd -h localhost
- 使用预训练模型的代码如下:# 加载预训练模型 resNet50 = models.resnet50(pretrained=True) Res
- 身份证号码的编排规则前1、2位数字表示:所在省份的代码;第3、4位数字表示:所在城市的代码;第5、6位数字表示:所在区县的代码;第7~14位
- 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析requests请求封装原理,主要通过源码分析,总结出一套简洁的请求类
- 官方示例:uni-popup 弹出层 - DCloud 插件市场弹出层组件用于弹出一个覆盖到页面上的内容,使用场景如:底部弹出分
- 占位符通过占位符,可以指定格式进行输入或输出,以下为 fmt 标准库里的占位符:普通占位符占位符描述举例结果%v默认格式的值fmt.Prin
- 到了今天,数据库已经成了网站的灵魂,可以说,没有对数据进行集中管理就算不上是一个真正的网站。而ASP加数据库,更成了主流中的主流,网站里的用
- 问题描述:我有一个这样的数据集叫test_result_test.txt,大概几百上千行,两行数据之间隔一个空行。N:505904X:0.9
- 字符画是一种由字母、标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画。静态图
- 在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构
- html_downloaderfrom urllib import requestdef download(url): &nb
- 本文章来为各位介绍一个python的例子,这个就是bootstrap+flask写登录页面的例子,希望文章能够对各位有所帮助。Flask是一
- 简介:with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally
- 1、Introduction之前写过2篇文章,分别是:Mysql主从同步的原理 Myql主从同步实战 基于此,我们再实
- lstm(*input, **kwargs)将多层长短时记忆(LSTM)神经网络应用于输入序列。参数:input_size:输入'x
- HTTPS介绍HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端
- using System;using System.Collections;using System.ComponentModel;usin
- 事先在网上搜索了一大圈,头都大了,看到那么多文章写道在python里安装psycopg2的各种坑和各种麻烦,各种不成功。搜索了一下午,索性外
- 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。本章节我们将为大家介绍如
- 引言“ 这是MySQL系列笔记的第五篇,文章内容均为本人通过实践及查阅资料相关整理所得,可用作新手入门指南,或