mysql第三天 事务

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的写日志
另外有线程把事务日志回写回数据区域硬盘

时间: 2024-12-12 18:59:01

mysql第三天 事务的相关文章

MySQL中Innodb的事务隔离级别和锁的关系的讲解教程_Mysql

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用

【MySQL】MySQL的四种事务隔离级别

[MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位.  2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束

MySQL · 特性分析 · 浅谈 MySQL 5.7 XA 事务改进

关于MySQL XA 事务 MySQL XA 事务通常用于分布式事务处理当中.比如在分库分表的场景下,当遇到一个用户事务跨了多个分区,需要使用XA事务 来完成整个事务的正确的提交和回滚,即保证全局事务的一致性. XA 事务在分库分表场景的使用 下图是个典型的分库分表场景,前端是一个Proxy后面带若干个MySQL实例,每个实例是一个分区. 假设一个表test定义如下,Proxy根据主键"a"算Hash决定一条记录应该分布在哪个节点上: create table test(a int p

java mysql 线程-mysql中用三个线程把表test中的数据取出来,怎么写?

问题描述 mysql中用三个线程把表test中的数据取出来,怎么写? mysql中用三个线程把数据库test表jsoup中的数据取出来,怎么写呀? 解决方案 类似分页取出 可行吗

MySQL · 引擎特性 · InnoDB 事务锁简介

InnoDB 事务锁系统简介 前言 本文的目的是对InnoDB的事务锁模块做个简单的介绍,使读者对这块有初步的认识.本文先介绍行级锁和表级锁的相关概念,再介绍其内部的一些实现:最后以两个有趣的案例结束本文. 本文所有的代码和示例都是基于当前最新的MySQL5.7.10版本. 行级锁 InnoDB支持到行级别粒度的并发控制,本小节我们分析下几种常见的行级锁类型,以及在哪些情况下会使用到这些类型的锁. LOCK_REC_NOT_GAP 锁带上这个FLAG时,表示这个锁对象只是单纯的锁在记录上,不会锁

MySQL · 引擎特性 · InnoDB 事务子系统介绍

前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoDB 的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块.如何实现MVCC及ACID.如何进行事务的并发控制.事务系统如何进行管理等相关知识.本文的目的是让读者对事务系统有一个较全面的理解. 由于不同版本对事务系统都有改变,本文的所有分析基于当前GA的最新版本MySQL5.7.9,但也会在阐述的过程中,顺带描述之前版本的一些内容.本文也会介绍5.7版本对事务系统的一些优

MySQL · 引擎特性 · InnoDB 事务锁系统简介

前言 本文的目的是对 InnoDB 的事务锁模块做个简单的介绍,使读者对这块有初步的认识.本文先介绍行级锁和表级锁的相关概念,再介绍其内部的一些实现:最后以两个有趣的案例结束本文. 本文所有的代码和示例都是基于当前最新的 MySQL5.7.10 版本. 行级锁 InnoDB 支持到行级别粒度的并发控制,本小节我们分析下几种常见的行级锁类型,以及在哪些情况下会使用到这些类型的锁. LOCK_REC_NOT_GAP 锁带上这个 FLAG 时,表示这个锁对象只是单纯的锁在记录上,不会锁记录之前的 GA

mysql的三个故障解决小结

mysql使用过程中经常会遇到的三个故障,在此小结一下. 1.MySQl服务无法启动 我们在使用mysql的过程中,常会遇到MySQl服务无法启动,具体报错信息:Starting MySQL ERROR.The server quit without updating PID file (/[FAILED]l/mysql/) 对这样的错误,网上的分析解释有很多,有人分析把skip-federated这个参数屏蔽就可以了,也有人认为删除mysql-bin.index这个文件就可以启动服务.或者检查

MySQL · 引擎特性 · InnoDB 事务系统

前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事务的回滚,多版本控制,垃圾清理,回滚段以及相应的参数和监控方法.代码主要基于RDS 5.6,部分特性已经开源到AliSQL.事务系统是InnoDB最核心的中控系统,涉及的代码比较多,主要集中在trx目录,read目录以及row目录中的一部分,包括头文件和IC文件,一共有两万两千多行代码. 基础知识