初探Mysql事务与锁

来源:互联网 发布:淘宝企业店铺有什么用 编辑:程序博客网 时间:2024/05/16 14:54

当前环境: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