mysql——事务机制和锁机制

首先提出问题?

通过测试,分析几个问题:

1.主键

2.隔离级别

3.如果没有主键,索引的类型,比如说如果有索引,那么是不是唯一索引?

4.查看上述SQL语句的执行计划

从以上四个方向分析,到底是哪个原因引起来?


什么是事务?

事务定义了一个服务操作序列,由服务器保证这些操作序列在多个客户并发访问和服务器出现故障情况下的原子性。

事务概念最初是由数据库管理系统领域发展起来的,是一种对共享数据库进行并发访问或者错误处理的范型。

一个事务由多个DML 语句在逻辑存储单元组成的。

DDL 语句将会显示提交任何事务。

事务的属性

Atomicity 原子性  由Redo 和undo 决定

Consistency  一致性   由undo 决定

Isolation 隔离性   由lock 决定

Durable 持续性   由Redo 决定

并发会存在问题?

脏块:简单地说就是,修改过但未提交的数据

不可重读:比如说有两个会话,一个会话已经修改过了,但是另一个会话打开就不会再出现修改之前的东西。

幻读:举个例子,比如有个账户给你汇款1000元,但是在别人未提交之前你是就不会看到这笔钱的。

事务的隔离级别    Mysql 默认的隔离级别是可重复读

读未提交的   读已提交的  可重复读   串行seriaizable 

事务隔离级别可以解决脏读,不可重复读、幻读

我们有时候因为,事务编程的不好习惯会产生以下一些情况:

在循环中提交   使用自动提交  使用自动回滚  大事务拆成小事务

锁的概念

是用在多个事务访问同一对象时根据这些操作访问同一对象的先后次序给事务排序。

不同数据库的锁实现:

InnoDB 行级锁

oracle 行级锁

myISM 表锁

sqlServer  行级锁 ,锁升级

InnoDB存储引擎中锁

InnoDB row lock (行锁)

行记录锁 Record Lock

间隙锁  Gap lock  在索引记录间隙上的锁,或者是第一条索引记录之前,最后一条索引记录上的间隙锁

下一键锁 Next-key lock 索引记录锁以及记录之间的间隙锁,二者的组合锁

MDL锁  

解决meta data lock

死锁原理与分析

根据Mysql 的加锁规则,可以写出不会发生死锁的sql,也可以定位出线上死锁的原因。

1.产生回路   两个或者两个以上的事务执行过程中,分别持有一把锁,然后加另一把锁(AB-BA),产生死锁。

2.加锁顺序不一致 两个或者两个以上的事务并发执行(同一时刻),因争夺锁资源而造成一种互相等待,产生死锁。

减少死锁的方法

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值