MySql锁机制和事物实现

什么是事物:

一个服务序列,在多个客户并发访问时候保持原子性。

事物的属性:A 、C、I、D

并发存在的问题?

脏读:现在有两个回话 , 第一个回话begin 开启事物 然后将a = 1 修改成 a = 2 (注意这里没有commit提交事物),这时候在第二个回话中看到了 第一个回话修改的内容 a = 2。(注意是并发处理应该是有锁控制住的,但是这里没有锁住)

不可重复读:现在有两个回话,第一个回话查询 出来 a = 1 , 这时候第二个回话做了修改a=2,这时候回到第一个回话中查询到a=2,这就叫不可重复读。(注意是并发处理应该是有锁控制住的,但是这里没有锁住)

幻读:现在有两个回话,第一个回话查询 a = 1,这时候第二个回话做一个添加操作,这时候回到第一个回话中发现多出来一条数据。(注意是并发处理应该是有锁控制住的,但是这里没有锁住)

事物隔离级别(处理 脏读、不可重复读、幻读)

1、读未提交(read Uncommited)

不能解决 脏读、幻读、不可重复读,没有锁控制,隔离级别最低

2、读已提交 Read Commited(用的最多的,oracal的默认隔离级别)

不能解决 幻读、不可重复读

3、可重复读 repeatable read (mysql默认的隔离级别)

解决了 幻读,不可重复读,脏读

4、串行 (Serializable)

基本没有并发 用的很少

辅助命令:

查看mysql隔离机制命令:show variables like ‘%iso%’;

什么是锁

多个事物访问对象时候,通过队列的排序执行。

InnoBD:行锁

MyIsam:表锁

当我们update的时候加了两把锁,表上先加锁,然后行上在加锁。

InnoDB锁的种类

1、共享锁 IS (表锁)

2、排他锁 S(行锁)

GAP LOCK锁解决幻读,不让在行与行之间插入

MDL锁,当select时,没有commit,另一个回话去删除表,会被锁住。

死锁

什么时候会产生死锁:

第一种情况:当我们开启两个回话窗口启动两个事物,分别对t1表和t2表进行修改,这时候两个事物在争夺资源,就发生了死锁,mysql默认会关掉事物复杂度小的锁。

减少死锁概率的操作:

首先死锁在mysql中是避免不了的我们只能降低死锁概率

1、设置死锁时间(innodb_lock_wait_timeout)

2、自动死锁检测,优先回滚小的事物

3、尽快提交小事物,小事物不容易发生死锁

4、在一定条件下考虑降低事物隔离级别

5、事物操作顺序保持一致

6、通过索引优化mysql效率,减小扫描范围从而降低死锁概率

原文:https://blog.csdn.net/u010310183/article/details/96480881

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值