事务:
当然有的人用begin /begin work .推荐用START TRANSACTION 是SQL-99标准启动一个事务。

start transaction  #开始一个事务
操作
savepoint  sp1     #保存点名称
操作
ROLLBACK
ROLLBACK To sp1    #回退到 sp1点
commit

当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 rollback结束,注意当你结束这个事务的同时也开启了新的事务!mysql 默认 autocommit=1,是自动提交的。

隔离级别
SQL标准定义的四个隔离级别为:

1.读未提交(Read Uncommitted):在READ COMMITED的事务隔离级别下,除了唯一性的约束检查以及外键约束的检查需要Gap Lock,InnoDB存储引擎不会使用Gap Lock的锁算法。这种隔离级别可以让当前事务读取到其它事物还没有提交的数据。这种读取应该是在回滚段中完成的。通过上面的分析,这种隔离级别是最低的,会导致引发脏读,不可重复读,和幻读。
2.读已提交(Read Committed):这种隔离级别可以让当前事务读取到其它事物已经提交的数据。通过上面的分析,这种隔离级别会导致引发不可重复读,和幻读。
3.可重复读取(Repeatable Read):这种隔离级别可以保证在一个事物中多次读取特定记录的时候都是一样的。通过上面的分析,这种隔离级别会导致引发幻读。
4.串行(Serializable):在SERIALIZBLE的事务隔离级别,InnoDB存储引擎会对每个SELECT语句后自动加上LOCK IN SHARE MODE,即给每个读取操作加一个共享锁,因此在这个事务隔离级别下,读占用锁了,一致性的非锁定读不再予以支持,一般不再本地事务中使用SERIALIZBLE的隔离级别,SERIALIZABLE的事务隔离级别主要用于InnoDB存储引擎的分布式事务。

查看当前会话的事务隔离级别


mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.03 sec)

查看全局事务隔离级别


mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.04 sec)

分布式事务
通过XA事务可以来支持分布式事务的实现,在使用分布式事务时,InnoDB存储引擎必须使用SERIALIZABLE的隔离级别,查看是否启用了XA事务支持(默认开启)

mysql> show variables like 'innodb_support_xa';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| innodb_support_xa | ON    |
+-------------------+-------+

mysql悲观锁
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

MySQL SELECT ... FOR UPDATE 的Row Lock 与Table Lock

举个例子:

使用场景:机器池resource表中有一个字段 status,status=0代表机器未被使用,status =job_id(!=0)表示机器已被某个job使用,那么分配机器时就要确保该机器 status=0。

如果不采用锁,那么操作方法如下:

1.查询出机器信息:select resource_id from resource where status=0 limit 1;
2.将该机器分配给该 job:update resource set status=<job_id> where resource_id =<刚查出的>;

上面这种场景在高并发访问的情况下很可能会出现问题:在A连接查出 status=0的任务时,当我们执行到第二步时 update时,可能有B 连接已经先把该 resource 的status更新为该 job_id,当 A 连接再更新时,会将 B 的更新覆盖掉。所以说这种方式是不安全的

所以应该使用锁机制,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。

设置MySQL为非autocommit模式:
set autocommit=0;
设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以,推荐start transaction)
//1.查询出商品信息
select resource_id from resource where status=0 limit 1 for update;
//2.修改商品status为2
update resource set status=<job_id> where resource_id=<resource_id>;
//4.提交事务
commit;/commit work;

假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。

例1: (明确指定主键,并且有此数据,row lock)

SELECT * FROM products WHERE id='3' FOR UPDATE;

例2: (明确指定主键,若查无此数据,无lock)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

例2: (无主键,table lock)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例3: (主键不明确,table lock)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例4: (主键不明确,table lock)

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

注1: FOR UPDATE 仅适用于InnoDB,且必须在事务区块(start sta/COMMIT)中才能生效。

注2: 要测试锁定的状况,可以利用MySQL 的Command Mode ,开二个视窗来做测试。

以上就是关于数据库主键对MySQL锁级别的影响实例,需要注意的是,除了主键外,使用索引也会影响数据库的锁定级别

因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受。所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍:

mysql 乐观锁
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式:

1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。用下面的一张图来说明:

举例:

还是机器池资源表 resource ,除了resource_id,machine_name,status,再增加 version字段,

1.查询出机器信息:
select resource_id,version from resource where status=0 limit 1;
2.将该机器分配给该 job:
update resource set status=<job_id> where resource_id =<刚查出的> and version=<刚查出 version+1>;

这样就实现了乐观锁。

感兴趣的可以自己来我的Java架构群,可以获取免费的学习资料,群号:855801563 对Java技术,架构技术感兴趣的同学,欢迎加群,一起学习,相互讨论。

转载于:https://blog.51cto.com/13981400/2338458

mysql事务和锁 SELECT FOR UPDATE相关推荐

  1. mysql悲观锁关键字_MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

    MySQL悲观锁 select for update实现秒杀案例(jfinal框架) 发布时间:2018-08-17作者:laosun阅读(4287) 为了方便测试,博主使用最新的jfinal框架,里 ...

  2. 五、Mysql事务以及锁原理

    五.Mysql事务以及锁原理 事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种 ...

  3. 盘一盘MySQL事务和锁

    MySQL事务与锁 事务 事务的概念 事务Transaction,是指作为一个Session执行的一系列SQL语句的操作,要么完全的执行,要么完全的都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

  4. mysql 事务涉及锁吗_MySQL-锁机制和事务

    测试: 4.5.innodb_locks_unsafe_for_binlog innodb_locks_unsafe_for_binlog参数用来控制innodb中是否允许间隔锁,默认是OFF代表允许 ...

  5. Mysql事务和锁原理

    一.mysql事务:MySql开启事务:begin. 1.并发事务产生的读问题  1)更新丢失:后提交事务会覆盖先提交的事务.乐观锁可解决. 2)脏读:A读到B未提交update数据.不符合一致性 3 ...

  6. mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解

    一.事务 数组库的一组操作,要么全部成功,要么全部失败 举例:银行转账 A账户向B账户转100 A账户余额扣去100 B账户余额增加100 上述两个操作要么全部成功,要么全部失败,部分成功或失败,数据 ...

  7. mysql事务和锁InnoDB(转)

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  8. javaweb(三十八)——mysql事务和锁InnoDB(扩展)

    MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就My ...

  9. 超详细图解!【MySQL进阶篇】MySQL事务和锁

    ACID 特性 在关系型数据库管理系统中,一个逻辑工作单元要成为事务,必须满足这 4 个特性,即所谓的 ACID: 原子性(Atomicity).一致性(Consistency).隔离性(Isolat ...

  10. mysql事务和锁innodb,MySQL - InnoDB 锁与事务(三)隔离级别与表的关系

    事务的隔离级别是用来调节数据库的并发性和数据的可靠性之间的平衡的工具.MySQL支持所有四种标准的隔离级别,Repeatable Read,Read Commited,Read Uncommited, ...

最新文章

  1. Java中JDK,JRE和JVM之间的关系
  2. 小米澄清传闻:不存在跨境转移利润及逃避缴纳税款行为
  3. Mybatis的一对多查询
  4. 如何处理SAP Fiori gateway service使用过程中遇到的404 error
  5. python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)
  6. 对照片进行边缘化处理,并将边缘化处理后的结果保存
  7. Qt工作笔记-右键菜单造成内存泄漏等分析
  8. 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...
  9. Django Rest Framework 部分源码剖析
  10. 网页三剑客8免费下载加序列号
  11. 2019年上海理工大学《高等代数》试题和答案——解题人(蔡宇)
  12. 杭电oj2029c语言答案,杭电oj2029
  13. IBM X系列服务器通过sysmgmt接口查看日志
  14. mysql 关闭防火墙 命令_CentOS7关闭防火墙命令
  15. Linux新手入门之基础命令操作
  16. 如何应对项目范围变更管理
  17. BootStrap笔记-下拉菜单的使用
  18. 2019写给对象的话_最新写给女朋友的情话短句 一句话形容最好的爱情说说2019
  19. JS 日期的获取和计算 ios不兼容问题
  20. 【机器学习】逻辑斯蒂回归原理推导与求解

热门文章

  1. Code First 约定
  2. 重大危机引发的公司经营战略问题回顾
  3. 基于粒子群和麻雀搜索的LMS自适应滤波算法 - 附代码
  4. 智能优化算法应用:基于GWO优化的最小交叉熵图像多阈值分割 - 附代码
  5. JS学习总结(10)——Windows对象
  6. HTML学习总结(2)——标题/水平线/注释/段落/折行/文本格式化
  7. EXCEL 选中单元格并拖动等操作。
  8. JDK动态代理与CGLIB的区别
  9. EditPlus安装及远程连接Linux
  10. Flutter之实战InheritedWidget详解