mysql第三天 事务

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: <div class="markdown_views"><h2 id="acid">ACID</h2><ul><li>A : 原子性 要么全提交成功,要么全失败回滚</li><li>C:一致性 是从一个一致性状态到另外一个一致性状态。 意思就是说能量守恒。 <br> 还有的人理解其是外键的定义,即对于有班级的学生,不能创建一个不指定班级的学生 <

ACID

  • A : 原子性 要么全提交成功,要么全失败回滚
  • C:一致性 是从一个一致性状态到另外一个一致性状态。 意思就是说能量守恒。
    还有的人理解其是外键的定义,即对于有班级的学生,不能创建一个不指定班级的学生
    还有人认为一致性和原子性共同满足了全好全坏的限定。
    我认为在分布式数据库中这个概念才更有意义,如何做到多几点的一致性
  • I:隔离性 跟隔离级别相关,通常来说,事物看不到其他未提交的事务的状态
  • D:持久性 事务一旦提交,所做的修改就是永久保存的

隔离级别

先看一下事务并发操作可能遇到的问题:

  • 脏读
    A 修改数据,未提交。 B读取到了A修改后的数据, 如果A提交失败那么该修改就不会生效因此就造成了B读取到了脏数据。
  • 不可重复读
    A事务两次读取同一行数据,B事务在两次之间修改了数据并提交,导致了A前后两次读取数据的不一致。
    可以使用行锁来解决,但是会减少性能,还可以使用MVCC策略解决
  • 幻读
    A事务读取范围数据, B事务在范围之间删除或者新增了数据,A事务再次读取该范围时数据发生了变化。
    可以使用间隙锁解决,还可以使用MVCC策略,这样可以减少阻塞。

mysql 中设置隔离级别

my.ini

#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ

当前session

SELECT @@tx_isolation;
set transaction isolation level read uncommitted;
set transaction isolation level read committed;    
set transaction isolation level repeatable read;  
set transaction isolation level serializable;

再看看隔离级别对应解决了的问题

READ UNCOMMITED

//session1
set autocommit = 0;
set transaction isolation level read uncommitted;
begin;
update biz_pay_task set pin = 'test1' where id=1;

// session 2
set autocommit = 0;
set transaction isolation level read uncommitted;
select * from biz_pay_task where id=1;

// session1,2
rollback;
  • 可以看到session2能够读取到未交的session1中的数据
  • 因此上面三个问题都有可能发生

READ COMMITED

// session 1,2
 set transaction isolation level read committed; 
// session 1
update biz_pay_task set pin = 'test1' where id=1;
// session 2
select * from biz_pay_task where id=1;
// session 1
commit;
// session 2
select * from biz_pay_task where id=1;
rollback;
  • 可以看到session2只能够查看到sesssion1中已经提交了的变更。
  • 避免了脏读
  • 很多数据库默认都是这个级别

REPEATABLE READ

// session 1,2
set transaction isolation level repeatable read;  
begin;
// session 1
update biz_pay_task set pin = 'test2' where id=1;
commit;
// session 2
select * from biz_pay_task where id=1;
rollback;
begin;
select * from biz_pay_task where id between 1 and 3;
// session 1
begin;
 delete from biz_pay_task where id=2;
// session 2
select * from biz_pay_task where id between 1 and 3;
// session 1
commit;
// session 2
select * from biz_pay_task where id between 1 and 3;
rollback;
  • session2事务开始后,session1所有的提交都对其没有影响
  • 可重复读这个隔离级别避免了 不可重复读以及幻读的问题。
  • 幻读问题本来并不是这个隔离级别能完成的,mysql通过mvcc的机制在这个隔离级别完成了
  • 是mysql的默认隔离级别

SERIALIZABLE

强制事务顺序执行

事务日志

mysql使用事务日志来提高写的性能,不是每次都用随机IO来写硬盘,
而是先写内存,记录硬盘一小块区域顺序io的写日志
另外有线程把事务日志回写回数据区域硬盘

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
1月前
|
关系型数据库 MySQL 数据库
MySQL事务(简单明了)
MySQL事务(简单明了)
|
1月前
|
SQL 关系型数据库 MySQL
MySQL索引与事务
MySQL索引与事务
100 0
|
2月前
|
存储 关系型数据库 MySQL
Mysql高可用|索引|事务 | 调优
Mysql高可用|索引|事务 | 调优
|
1月前
|
关系型数据库 MySQL 数据库
深入探讨MySQL并发事务的问题及解决方案
深入探讨MySQL并发事务的问题及解决方案
72 0
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL - 深入理解 MySQL 的事务和隔离级别
MySQL - 深入理解 MySQL 的事务和隔离级别
198 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】4、MySQL 事务学习
【MySQL 数据库】4、MySQL 事务学习
44 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql事务隔离级别和锁特性
Mysql事务隔离级别和锁特性
|
13天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
29 5
|
26天前
|
关系型数据库 MySQL 测试技术
面试-MySQL的四种事务隔离级别
面试-MySQL的四种事务隔离级别
18 0