一般我们说的数据库中的锁(用于并发控制) 可分为 悲观锁 和 乐观锁
可以认为一般数据库并发控制(如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' )