mysql事务和锁

尝试进行归纳总结事务和锁的一些思考.

数据库是什么? 保存数据的地方.

为什么保存数据要用数据库呢? 我直接把数据放文件里, 不也一样吗? 比如我自己序列化json文件保存成txt文件成不? 也行, 但是就不方便检索, 之类的.

数据库就方便检索了呀, 数据库相比文件系统有4个特点:

  • A - 原子性
  • C - 一致性
  • I - 隔离性
  • D - 持久性

这里只说锁, 锁是用来保证隔离性的.

隔离性是啥?

比如, 我现在自己实现了一个不怎么完善的数据库, 只是按SQL标准实现了增删改查等命令, 但是操作的数据是直接落实到系统的文件上的. 同时, 要知道SQL标准也规定了4种数据库事务隔离级别, 别急, 我们这个不完善的数据库没有实现事务隔离级别, 也没有实现任何锁, 仅仅是我们知道有这么个东西而已, 暂时不打算去实现它^_^

虽然我们没有实现它, 但还是可以从事务的角度来进行一下思考, 也就是说我们假想事务这么个东西, 可以启动事务, 提交事务和回滚事务.

假设两个事务--A, B, 说明以下几种存在的问题:

  • 脏读 - A事务启动, 先读取一行, 值为1, 还没提交, B事务启动, 修改了A刚刚读取的那一行, 修改为2, 注意, 没有锁, 虽然在我们的想像中, B还没有提交, 但是anyway, B就是直接就把修改写到文件里了, 然后A再读取这一行, 值是2. 这叫做A事务读取到了B事务还没提交的数据, 是为脏读.
  • 不可重复读 - A事务启动, 先读取一行, 值为1, 还没提交, B事务启动, 还是把A读取的一行修改为2, 注意, 接下来B提交了, 嘿嘿, 刚刚B没提交, 这下B提交了, 是不是没问题了? No way!! 不管怎样, B还是把2写到文件里了, 然后A再读取这一行, 值是2. 这叫做A事务的两次对同一记录读取到了不同值, 是为不可重复读.
  • 幻读 - A事务启动, 读取值小于2的, 假设现在就一条, B事务启动, 插入了一条值为1的, 不管提交不提交, A事务再去读取值小于2的记录, 就会发现有两条了. 是为幻读, 怎么我出现幻觉了吗? 刚刚还是一个呢, 现在怎么变成俩了??
  • 丢失更新 - 不说了

锁和MVCC主要就是用来解决以上几个问题的, 如何解决? 且听下回分解.

原文地址:https://www.cnblogs.com/lihan829/p/11441079.html

时间: 2024-11-08 23:22:26

mysql事务和锁的相关文章

mysql事务和锁InnoDB(转)

背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因. 注:MySQL是一个支持插件式存储引擎的数据库系统.本文下面的所有介绍

mysql事务和锁InnoDB

背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因. 注:MySQL是一个支持插件式存储引擎的数据库系统.本文下面的所有介绍

Mysql 事务与锁机制

一. 事务四要素 数据库事务正确执行的四个基本要素包括原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability),简称ACID.目前要实现ACID主要有两种方式:一种是Write ahead logging,也就是日志式的方式(现代数据库均基于这种方式):另一种是Shadow paging. 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)

MySQL事务和锁 (四)

一 .事务 1.1 事务的概念 mysql把多条写操作视为一个整体去执行,要么全部成功,要么全部失败,我们把mysql的这种处理叫做事务.(“多条”很好理解就是至少两条sql语句,“写操作”就是指对msyql内容修改的操作(insert.update.delete)). 1.2事务的特性 原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态. 一致性: 确保数据库正确地改变状态后,成功提交的事务. 隔离性: 使事务操作彼此独立的和透明的. 持久性

关于mysql事务行锁for update实现写锁的功能

 例子1: 在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. (for update仅仅适用于InnoDB) 我们都知道for update实际上是共享锁,是可以被读取的.但是如何在执行时,不被读取呢. 简单来说:假设现在库存为1,现在有A和B同时购买 先开启一个事务 begin; select stock from good where id=1 for update;//查询good表某

mysql事务与锁

事务acid原则 原子性 隔离性 一致性 持久性 事务的概念 把需要保证原子性.隔离性.一致性和持久性的一个或者多个数据库操作称为事务. 事务的使用 语法 begin;//开启一个事务 some sql;//需要执行的语句 savepoint bussiness1;//事务保存点 some sql; roll back to bussiness1;//回滚 commit;//提交事务 rollback;//如果需要手动回滚的话在提交之前删除这句 事务的自动提交 通常情况下mysql默认自动提交事

MySQL事务、锁

事务描述: 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务.事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行.事务它还可以用来管理DDL.DML.DCL操作,比如 insert,update,delete 语句.一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性): 构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行 Consistency(稳定性.一致性):      数据库在事务执

[数据库事务与锁]详解六: MySQL中的共享锁与排他锁

注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使用方式及注意事项等. 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁.其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁. 如果事务T对数

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的