美文网首页
mysql的锁和事务隔离级别

mysql的锁和事务隔离级别

作者: 寒江_d764 | 来源:发表于2019-07-14 19:06 被阅读0次

    一 锁的分类以及实现

    1.1 锁概念

    共享锁:共享锁加上了,只能读不能写,事务a和事务b都可以读数据,但是如果事务a加上锁,事务b

    可以读,但是不能写,只有事务a可以写

    排他锁:排他锁加上了,其他事务既不能读也不能写,会把加锁的所有数据锁上,比如事务a和事务b

    事务a加上了行锁,事务a可以对加锁的数据进行读和写,但是事务b只能等待事务a commit完,事务a

    释放掉锁,事务b才会读和写

    行锁:语义上很容易理解,就是事务一行加锁,比如sql语句:

    select * from merchent_order where id = 1 for update

    因为id是主健,默认对id=1的数据进行加锁,锁住一行数据

    表锁:锁整个表,比如sql语句:

    select  * from merchant_order for update;

    对整个表进行加锁。

    悲观锁:比如mysql的for update,禁止其他事务进行读写操作,实际上在高并发场景下,对整个系统的吞吐性来讲,比较差,在数据很严格要求一致性的情况下,这种加锁方式有效,但是会牺牲系统的性能,所以一般在系统查询占比很多的情况下会加乐观锁,

    乐观锁:加上版本号就可以实现乐观锁,类似java的CAS机制,具体实现sql:

    update merchant_order set num = num+1 where version = ${version}

    1.2 mysq事务隔离级别

    读未提交:最低的事务隔离级别,事务a可以读取事务b提交的数据,可能出现脏读,幻读

    读已提交:事务a可以读取事务b提交的数据,可能出现幻读,不允许任何中间状态出现,所以

    不可能出现脏读,可能出现不可重复读。

    备注:不可重复读(第一次和第二次读取的数据可能不一样),可重复读(第一次和第二次查询

    的数据一致)

    可重复读:多次同一个事务读取的事务是一样的,没有幻读出现,也没有脏读

    串行化:读取的时候,默认加共享锁,等一个事务执行完,下一个事务才能开始执行,更新需要获取

    排他锁,是最高的隔离级别

    相关文章

      网友评论

          本文标题:mysql的锁和事务隔离级别

          本文链接:https://www.haomeiwen.com/subject/qcxikctx.html