什么是事物:
一个服务序列,在多个客户并发访问时候保持原子性。
事物的属性: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