1、mysql的四种事务隔离级别
I. 对于同时运行多个事务,当这些事务访问数据库中的相同数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
   (1)脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
   (2)不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
(3)幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
  
II.数据库事务的隔离性:数据库必须的隔离并发运行多个事务的能力,使它们不会相互影响,避免各种并发问题。
  
   III.隔离级别:一个事务与其它事务的隔离程度称为隔离级别,数据库规定了多种隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数扰一致性就越好,但并发性也就越弱。
   (1)读未提交数据,允许事务读取未被其它事务提交的变更,上面三个问题都会出现。
   (2)读已提交数据,允许事务读取被其它事务提交的变理,避免脏读,但会出现不可重复读和幻读。
(3)可重复读,确保一个事务可以从一个字段读取相同的值,在此事务持续期间,禁止其它事务操作该字段,幻读问题仍存在
(4)串行化,效率低
  
IV.mysql默认的隔离级别是可重复读,设置数据库隔离级别有两种方式
   (1)使用Sql语句修改数据库的隔离级别。
   (2)在 Hibernate 中设置隔离级别
    READ UNCOMMITED
   READ COMMITED
    REPEATABLE READ
SERIALIZEABLE

2、mysql悲观锁

只有执行select * from table for update语句时,才会执行mysql的悲观锁,
要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,
也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

(1)mysql的锁级别,Row Lock和Table Lock ,mysql的默认锁级别是Row-Level Lock
表A有三个字段 id , name, age,其中id为主键,name有索引,age为普通字段
a.执行select * from A where id=1 for update
这种情况会锁row
b.执行select * from A where name=1 for update
这种情况会锁row
c.执行select * from A where age=1 for update
这种情况会锁表

(2)悲观锁,它指的是某一事务,对数据被另一事务的修改持保守态度,即,每次查询的时候就会锁定记录或锁定表,直到修改完成
需要注意的是,如果事务A执行了select * from A where id = 3 for update ,则B事务如果执行
select * from A where id = 3 for update则要等待A事务结束后才会执行
3、mysql乐观锁
(1)概念:
乐观锁假设认为数据一般情况下不会造成冲突所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,
如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
(2)实现方式
方式一:
使用数据版本(Version)记录机制实现,将version字段的值一同读出,数据每更新一次,对此version值加一。
当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,
如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据
方式二:
需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp),
和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,
如果一致则OK,否则就是版本冲突。
4、悲观锁使用场景举例
有两张表,一张货物表goods,一张用户表account,账户表有用户名和用户钱数
不使用锁的情况下:
(1)A用户查询goods表,发现货物还剩一件,然后A用户执行付款操作,此时,B用户也发现goods表还有一件,也执行付款操作,
(2)B的动作比A快,此时B付完款,goods表减1,此时A也付完款了,发现货物没了,所以就有问题
联想到事物一个使用场景,
A访问表,修改goods表的剩余量,是一个事物,
A付款是一个事物,保证两个事务都完成,或者都完不成,两个小事务要运行在一个大事务里面

5、悲观锁和乐观锁的总结
乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,
加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,
这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

mysql-mysql悲观锁和乐观锁的更多相关文章

  1. mysql的锁--行锁,表锁,乐观锁,悲观锁

    一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...

  2. Mysql锁机制--乐观锁 & 悲观锁

    Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...

  3. Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...

  4. MySQL学习笔记(四)悲观锁与乐观锁

    恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...

  5. mysql 悲观锁与乐观锁的理解

    悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段. 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈. 一.悲观锁 顾名思义,就是对于数据的 ...

  6. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  7. 关于MySql悲观锁与乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...

  8. 【MySQL锁】MySQL悲观锁和乐观锁概念

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...

  9. mysql悲观锁与乐观锁

    简介 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 用途 乐观锁和悲观锁是并发控制主要采用的技术手段.无论是悲观 ...

  10. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

随机推荐

  1. python中isort的使用

    是一个使import 列表更美观的工具包,官方例子如下: before from my_lib import Object print("Hey") import os from ...

  2. Mysql配置项的简单优化

    preface 众所周知,Mysql已经成为广泛使用的开源数据库了,so 公司阿里云的数据库为Mysql,在最开始的时候是直接yum安装,配置项都是默认的,没有任何调整,这次有时间就参考各路大神的资料 ...

  3. HDU1698Just a Hook(线段树 + 区间修改 + 求和)

    题目链接 分析:1-N区间内初始都是1,然后q个询问,每个询问修改区间[a,b]的值为2或3或者1,统计最后整个区间的和 本来想刷刷手速,结果还是写了一个小时,第一个超时,因为输出的时候去每个区间查找 ...

  4. Docker入门教程(四)Docker Registry

    Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...

  5. java中"与"和"或"

    在java中"与"和"或"都具有短路功能. 关于"或"运算如 if(mc == null || mc.getReceive()==0){ / ...

  6. redis auth php操作

    <?php//Connecting to Redis server on localhost$redis = new Redis();$redis->connect('192.168.33 ...

  7. 内嵌DB

    SQLLite H2 MySQL Embeded 等 比较项目 SQLite H2 database engine MySQL Embedded Footprint 350KiB ~1MB <2 ...

  8. 11 Clever Methods of Overfitting and how to avoid them

    11 Clever Methods of Overfitting and how to avoid them Overfitting is the bane of Data Science in th ...

  9. HTML+JS+DOM【选项卡自动切换】

    最终效果图(鼠标无操作会自动切换选项卡): <!DOCTYPE html> <html> <head> <meta charset="gb2312& ...

  10. Visual Studio低版本升级到Visual Studio 2012出现Warning LNK4075

    Warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/SAFESEH' specification