9 章 事务与锁机制

show variables like 'autocommit'; 查询是否开启自动提交
@@autocommit为on或1时表示开启自动提交。
set autocommit=0;可以显示的关闭自动提交。
使用MySQL命令 start transaction;可以隐式的关闭自动提交。
commit;命令可以显示的提交事务。
savepoint 保存点名;
rollback to savepoint 保存点名;
release savepoint保存点名;可以删除一个事务保存点。
MySQL的锁:锁的粒度,隐式锁,显式锁,锁类型,锁的钥匙,生命周期。
锁的粒度:服务器及锁(server-level)和存储引擎级锁(storage-engine-level locking)
服务器级锁以服务器为单位,与表的存储引擎无关。
flush tables with read lock; 锁定当前MySQL服务实例,是服务器级读锁
MyISAM 只支持表级锁
InnoDB 支持表级和行级锁。
数据库自动为数据加锁,解锁,这种锁称为隐式锁。隐式锁无需开发人员维护。
读锁(read lock) 也叫共享锁
写锁(write lock) 排他锁或独占锁
锁的钥匙:
多个MySQL客户机并发访问一个数据,如果客户机A对该数据成功加锁,那么A拥有这把锁的钥匙,也只有A能够对该锁进行解锁。

MyISAM引擎 select操作 会添加隐式读说, insert,update,delete会隐式写锁,
即MyISAM引擎都会隐式的添加表级锁。
alter table account engin=MyISAM;
alter table book engin=MyISAM;
lock tables account read;
select * from accout;
select * from book;
unlock tables;
如果一个表需要同时添加读锁和写锁,那么需要为该表起两个别名,以区分读锁和写锁。
read local 与read区别在于 read local是会话级别,后者是全局。

InnDB行级锁:
1: 共享锁 select * from 表 where 条件语句 lock in share mode;
2: 排它锁 select * from 表 where 条件语句 for update;
insert, update , delete会隐式的添加排它锁。
延迟行级锁的生命周期,可以通过添加事务来。
事务中的行级共享锁和排它锁的生命周期从加锁开始,直到事务提交或者回滚,行级锁才会释放。

意向锁是隐式的表级锁,数据库开发人员在向InnoDB表的记录添加行级锁时,InnoDB引擎会先自动向该表添加意向锁,然后在添加行级锁。
意向锁: 意向共享锁(IS) 和 意向排它锁 (IX)
说明:
意向锁虽然是表级锁,但是却表示事务正在查询或更新某一行记录,而不是整个表,因此意向锁之间不会产生冲突。
sql执行完毕后,意向锁会自动解锁,因此意向共享锁生命周期非常短暂,且不受为控制,意向排他锁也是。
InnoDB 表的行级锁是通过对“索引”施加锁的方式实现的,这就意味着,只有通过索引字段检索数据的查询语句或者更新语句,才可能施加行级锁,否则InnoDB将使用表级锁,而使用表级锁势必降低表的并发性能。

show variables like 'innodb_lock_wait_timeout';
show full processlist; 查看当MySQL实例运行的线程信息
kill 线程id;
对于数据库开发人员而言,如果不了解InnoDB行级锁是基于索引实现这一特性,可能会导致大量的锁冲突,从而影响并发性能。

间隙锁(next-key),间隙锁也与索引密切相关。间隙锁会锁住没加锁的相邻的数据
记录锁,仅仅为满足查询范围记录的施加锁
Mysql的事务隔离级别为 repeatable read是 默认使用时间隙锁
隔离级别是 uncommitted或read committed 默认是记录锁

默认下,InnoDB存储引擎一旦出现锁等待超时异常,InnoDB存储引擎既不会提交事务,也不会回滚事务,而这是十分危险的,一旦发生锁等待超时,应用程序应该自定义错误处理程序,由开发人员选择是进一步提交事务还回滚事务。

默认情况下InnoDB存储引擎会自动检测死锁,通过比较参与死锁问题的事务权重,从而选择权重较小的事务进行回滚,并释放锁,以便其他事物获得锁,继续完成事务。每个事务的权重存储在information_schema 数据库INNODB_TRX表的trx_weight字段中。

事务的ACID特性
原子性
一致性
隔离性
持久性

事务的隔离级别:
Read uncommitted 读 未提交数据
Read committed 读已提交数据
Repeatable read 可重复读
Serializable 串行化
脏读:一个事务读取到另一个事务未提交数据。
不可重复读:同一个事务内,两条相同的查询语句的查询结果不一致。
幻读:同一个事务内,两条相同查询语句的查询结果本应该相同。但是,如果另一个事务同时提交了新数据,当本事务更新时,会“惊奇的”发现这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

select @@session.tx_isolattion; 查询MySQL服务实例的隔离级别
select @@global.tx_isolation; 查全局
设置隔离级别
set { global | session} transaction isolation level {
read uncommitted | read committed | repeatable read | serializable
}

说明:不可重复读与脏读的区别在于,脏读现象是读取了其他事务未提交的数据;而不可以重复读现象读到的是其他事务已提交的数据。

说明:幻读现象与不可重复读现象的不同之处在于,幻读现象读不到其他事物已经提交的数据,而不可重复读现象读到的是其他事物已经提交的数据。

避免幻读的两个方法:
1:保持事务的隔离级别是repeatable read不变,利用间隙锁的特点,对查询结果集施加共享锁(lock in share mode) 或排它锁 (for update )。这种方法要求数据库开发人了解间隙锁的特点
2:将事务的隔离级别设置为serializable,可以避免幻读现象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容