事物和锁的笔记

事物隔离级别:

读未提交 (另一个事物未提交的修改在当前事物中也能看到),
读已提交
可重复度 (同时开启的事物,另一事物的修改已提交,当前事物看不到),
串行

DML锁(数据库管理语言):insert update
DDL锁(数据库定义语言):create table,alter table
DCL 数据库控制语言:grant commit
DQL 数据库查询语言:select

DML锁 表级锁
TX锁:事务锁,事物发起修改的时候,持有事务锁,回滚和提交才释放。
TM锁: 锁表结构,不会被修改,譬如update时防止被alter
DDL锁 防止其他sql session对这个表进行修改

表级锁: 对表加锁,开销小,加锁快,粒度大,产生锁冲突的概率大,并发低
行级锁: 对某一行数据加锁,加锁慢,开销大(有索引的时候是行级锁,无索引的时候是表锁)

共享锁: 读锁,一个事物获取了一行数据的共享锁,其他事物可以读,不能增删改
排它锁: 写锁,一个事物获取了一行数据的排它锁,其他事物不能获取该行的其他锁,只能等待释放,
select * for update,显式的添加排它锁
排它锁是悲观锁,将数据记录锁住,其他程序不能修改记录,解决了并发问题,但是效率太低。

悲观锁: 每次拿数据都加锁,select for update。
乐观锁: 每次拿数据都觉得别人不修改数据,通过版本号控制并发。适用于高并发,吞吐量大的场景。

CREATE TABLE `goods` (
`id` INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`num` INT, 
`version` INT 
) COMMENT = '商品表';

id | num | version |6  | 1   | 0       |
A)update goods set num = num - 1 where id = 6;有两个事物在提交的时候会导致num数量变为-1;
B)update goods set num = num - 1,version=version+1 where id = 6 and version=0;version用来 控制版本。
B中事物运行的时候并不会报错,只会是修改的行数为0

比较

1.响应速度:高吞吐量使用乐观锁,悲观锁的响应速度比较慢
2.冲突频率高,并发不高,使用悲观锁。

死锁: 第二个事物回滚。
锁等待: 查锁:show open tables where in_use>0; show processlist
关闭锁:kill id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值