关于数据库锁类别的理解

一般我们说的数据库中的锁(用于并发控制)  可分为 悲观锁 乐观锁

 可以认为一般数据库并发控制(如mysql)默认都是采用悲观锁控制(悲观锁的具体实  现机制包含排它锁、表锁、行锁等) 


悲观锁/乐观锁个人理解 :(下面的文字只是说明两种锁含义)

例如对于表t_test(id, name)中的一行数据 ( id=1,  name='AAA' ), 

线程S1修改id=1的记录且没有提交的同时线程S2此时进行修改id=1的记录并准备修改完成后提交。


如果是悲观锁线程S2是无法进行修改和提交操作,S2线程此时被阻塞,必须等待S1提交完成才能提交或等待一定时间后抛出锁等待超时异常。

一般悲观锁 当你打开一个事务时,在事务中进行update,delete,insert 操作,你操作的那些行数据就加上了所谓的悲观锁控制。此时另外一个事务是不能在锁定的行数进行其他的update,delete,insert操作的。


如果是乐观锁线程S2可以提交完成(虽然是在S1之后进行操作的),

S2提交完成后,如果此时S1准备提交时发现数据已被S2更新了,则S1的操作失败。

一般乐观锁是业务上实现的,非数据库内部支持的。例如上面的表 t_test 要实现乐观锁并发控制则一般的做法就是新增一列 版本号字段  t_test(id,name,version),版本号version可以是数字或时间戳等。当更新数据时加上version判断 ( update t_test set name = 'xxx' where id = 1 and version = '更新前获得的version' )





猜你喜欢

转载自blog.csdn.net/gzt19881123/article/details/54602277
今日推荐