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

MySQL事务

事务特性ACID

1. Atomicity(原子性)
2. Consistency(一致性)
3. Isolation(隔离性)
4. Durability(持久性)
  • 查看事务隔离级别
    select @@tx_isolation;
  • 开始关闭事务
//开始事务
start transaction/begin;

//提交或回滚
commit/rollback
  • 设置事务自动提交开关
    SET autocommit = {0 | 1}
  • 设置事务隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL READ COMMITTED

可选的事务隔离级别有:
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
SERIALIZABLE

数据库并发问题

  • 读脏
    事务T1读取了事务T2未提交的更新后的数据。
  • 不可重复读
    事务T1执行过程中,事务T2提交了新数据,事务T1在事务T2提交前后读到的数据不一致。
  • 幻读
    事务T1的插入或删除(事务已提交)导致事务T2在行数上不一致的情况。

    MySQL各事务隔离级别对并发问题的解决

事务隔离级别读脏不可重复读幻读
读未提交(Read-Uncommitted)可能可能可能
读提交(Read-Committed)不可能可能可能
可重复读(Repeatable-Read)不可能不可能可能
串行化(Serializable)不可能不可能不可能
下面两个例子说明RR下是有幻读现象的
create table goods(
id int primary key,
name varchar(100),
amount int not null
);
  1. 插入幻读
事务1事务2
begin;begin;
select * from goods;
Empty set (0.00 sec)
insert into goods(id, name, amount) values(1, '苹果', 100);
commit;
insert into goods(id, name, amount) values(1, '苹果', 100);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

对于事务1,开始表为空的,后来插入是重复的key,幻觉出现。

  1. 更新幻读
事务1事务2
begin;begin;
select * from goods;
1 row in set (0.00 sec)
insert into goods(id, name, amount) values(2, '香蕉', 100);
commit;
update goods set amount=1;
Rows matched: 2 Changed: 2 Warnings: 0

对于事务1,开始查询表有一条记录,后来更新却发现有两条数据被更新了,幻觉出现。

共享锁与排他锁

共享锁(shared (S) lock)
A kind of lock that allows other transactions to read the locked object, and to also acquire other shared locks on
it, but not to write to it.  
共享锁又叫S锁,一个事务对资源加共享锁,那么其他事务还可以对此资源加共享锁,但是不能加排他锁。也即是说对资源加共享锁意味着资源可以被读但是不能对其进行删除和修改。如果事务T1对某一资源加共享锁,在没有其他事务对此资源加共享锁的情况下那么T1还可以对此资源加排它锁。  

使用语法:
begin;
select * from tableName where id=2 lock in share mode;
commit;
排他锁(exclusive (X) lock )
A kind of lock that prevents any other transaction from locking the same row. Depending on the transaction
isolation level, this kind of lock might block other transactions from writing to the same row, or might also block
other transactions from reading the same row. The default InnoDB isolation level, REPEATABLE READ, enables
higher concurrency by allowing transactions to read rows that have exclusive locks, a technique known as
consistent read.  
排他锁又叫X锁,在事务中删除、更新以及插入都会对资源加排它锁,对资源加排它锁后就不能对其加共享锁和排它锁了。如果再加则会引起阻塞直到上一个锁释放。

使用语法:
begin;
select * from tableName where id=2 for update;
commit;

转载于:https://blog.51cto.com/wenshengzhu/2165713

相关文章:

  • javaOOM该分析dump文件而不是看异常log日志原因
  • DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么
  • NOIP2011DAY1T3 Mayan游戏
  • 1109 Group Photo
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1...
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 串口发送数据速度
  • Lsb图片隐写
  • react-native-echarts 在手机上 图表出现滚动条解决方法
  • Python利用Selenium自动登录掘金
  • ASP.NET CORE Combines Angular to Create SPA
  • 海量数据处理 - 十道面试题与十个海量数据处理方法总结
  • 如何搭建一个完整的交易框架
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • easyui datagrid 相关取数据总结
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CODING 缺陷管理功能正式开始公测
  • express如何解决request entity too large问题
  • extract-text-webpack-plugin用法
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • interface和setter,getter
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JDK 6和JDK 7中的substring()方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mysql innodb 索引使用指南
  • Netty源码解析1-Buffer
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • spark本地环境的搭建到运行第一个spark程序
  • Sublime text 3 3103 注册码
  • Vue组件定义
  • 对象管理器(defineProperty)学习笔记
  • 解决iview多表头动态更改列元素发生的错误
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 入门级的git使用指北
  • 使用parted解决大于2T的磁盘分区
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 再谈express与koa的对比
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (arch)linux 转换文件编码格式
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二十三)Flask之高频面试点
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (十五)使用Nexus创建Maven私服
  • (算法)Travel Information Center
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Unity3DUnity3D在android下调试
  • (转)原始图像数据和PDF中的图像数据
  • ./configure、make、make install 命令
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net Remoting常用部署结构
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded