1.数据库是如何加锁的,简单的sql语句
SELECT username
,passwd
FROM g_test
LIMIT 1 FOR UPDATE
正常的查询后加上FOR UPDATE 就是给数据库加锁了么?
2.加上FOR UPDATE是对写加锁,这个语句是否对DELETE生效?
3.MYISAM加锁是全表锁?
4.InnoDB是行锁?
新加问题
5.如果数据库开启了事务并加了锁,由于某些原因后续操作未进行彻底,没有commit或rollback,事务是否有超时机制?锁是否有超时机制?到期自动销毁
其他答主说的不够全面,我帮你整理一下吧。
首先我认为在谈到数据库各种机制前(尤其是MySQL这种插件式plugin存储引擎的数据库),你一定要声明你使用的存储引擎,不然问题无意义,此处我假定你的第1、2条问题是基于innoDB存储引擎下的,并且我的理论也是基于innoDB引擎。
明确概念,锁分为两种:
读锁->共享锁 (S)
写锁 -> 排它锁 (X)
写操作的为排它锁,读操作的为排它锁,
理论上来说只要被操作对象(例如 id =1这行)出现排它锁,那么除了该事务可以操作这行,其余事务全部无权对这行进行任何操作,无论是读操作还是写操作
对了,selct .. for update并不属于SQL规范,所以实际上应该避免使用。
select ..for update 是进行排它锁操作的,但是这条语句在事务中才有意义,因为在非事务情况下使用,一下子就完成了锁定与解锁的操作,无任何实际意义。
还有一点很重要的是innoDB在隔离级别为REPEATABLE READ和READ COMMITTED的事务操作中,并没有直接使用行级锁,而是使用了乐观机制MVCC,即大多数的读操作都不用加锁,即使是写锁也只是锁必要的行《了解MVCC》
回到你的问题:
1、“SELECT username,passwd FROM g_test LIMIT 1 FOR UPDATE” 是否加锁了?
2、“for update写加锁是否对delete语句有效?”
3、“MyISAM加锁是全表锁吗?”
4、“innoDB是行级锁?”
5、“事务和锁是否有超时机制”