初探Mysql事务与锁

当前环境:mysql的隔离级别是可提交读,引擎类型是Innodb,支持事务以及行锁。

可提交读避免脏读(可以读到未提交事务的数据),但是有重复读(在一个事务中,再次读到的数据发生了变化)的情况。


共享锁及排他锁,简单来说,共享锁是可以读不可以写,排他锁是既不可以读也不可以写

举例:


student表 

id int 主键

name varchar(20)

address varchar(200)


set autocommit=0, 当前session禁用自动提交事物
在默认的情况下,MySQL从自动提交(autocommit)模式运行,这种模式会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化


select * from student where id = 1 for update (添加的排他锁)

另起一个窗口,delete from student where id = 1, 会等待直到 [Err] 1205 - Lock wait timeout exceeded; try restarting transaction


因为对于id=1已经添加了行锁,不能再加另外的锁,除非之前的事务已经结束,释放掉已经持有的锁,

再起一个窗口,执行delete from student where id =2, 可以顺利删除,可以证明,添加的为行锁。


针对于 “Lock wait timeout exceeded; try restarting transactio”, 1 把未提交的事务提交了,但是实际环境中不太可能

2 找到未提交的线程,kill掉即可,可以通过查询 innodb_trx(information_schema),查到相应的线程id



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值