数据库事务(二)

数据库事务那些事

这期接着来说数据库事务的小知识,因为MVCC的本身需要很多基础作为基础,准备分享几期基础知识后,再分享MVCC的多版本并发控制的文章。

数据库的操作跟系统操作一样,会存在多个工作单元操作共享的存储单元的情况。在数据库中就是多个事务单元对同一个存储数据进行操作的时候,如果不用锁进行控制就会出现各种各样的数据不符合预期的问题。通过锁来控制数据库中的并发操作,来解决那些不符合预期的问题。

共享锁与排他锁

共享锁(S锁)

共享锁——用于SELECT操作,如果一个事务T对某一数据添加了共享锁后,那么其他事务在事务T释放共享锁之前也只能对该数据添加共享锁,只要加了共享锁那么事务也只能读取数据。

使用
MySQL:SQL + lock in share mode

排他锁(X锁)

排他锁——用于DML操作,一个事务T对某一数据添加了排他锁后,那么其他事务不能获取该数据的其他锁,只要加了排他锁的事务才可以读取或者修改加锁的数据。

使用
 MySQL:SQL + for update

悲观锁与乐观锁

悲观锁(Pessimistic Lock)

悲观锁——每次操作都会认为会发生操作冲突,所以只要是获取数据的时候都会尝试加锁,这样其他事务获取相应数据的时候就会出现阻塞,直到其他事务获取到相应数据的锁。

悲观锁的概念的具体实现有上面提到的两种锁——共享锁与排他锁的

乐观锁(Optimistic Lock)

乐观锁——每次操作都会认为不会发生操作冲突,所以不会对数据加锁就进行操作,注意在操作的时候会校验这条数据在这期间是否被操作过,很多数据库都是使用版本号来控制的,只要数据被操作过相应数据的版本号就会变化,这样可以提供比较好的并发度,如果DML相应的操作比较多的不太适用这种锁,会比较多的性能损耗。

这种锁的概念需要通过使用者自己来实现,数据库本身是不提供的。

表锁与行锁

表锁

表锁——顾名思义,就是将整张表锁住

行锁

行锁——顾名思义,就是锁住相应的数据行索引,如果

死锁

死锁——就是多个事务需要处理相同的几个共享资源,事务在同一时刻各自获取到了不同的资源,需要等待对方的资源释放掉,这个时候就产生了死锁。

总结

很多情况下对于使用者来说,数据库中的这几种锁会出现混淆,其实这两组锁是两种不同的概念与维度。文章本身比较简短希望可以起到一个抛砖引玉的作用。

你可能感兴趣的:(数据库事务(二))