首先提出问题?
通过测试,分析几个问题:
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.加锁顺序不一致 两个或者两个以上的事务并发执行(同一时刻),因争夺锁资源而造成一种互相等待,产生死锁。
减少死锁的方法