
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了Java编程开发中锁的类型与应用等内容,而本文我们就再来了解一下,MySQL数据库两段锁与一次封锁的区别。
1、两段锁
数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)
加锁阶段:在加锁阶段只能进行加锁操作。
如果事务要读取对象,必须先获得共享锁。可以有多个事务同时获得一个对象的共享锁
如果事务要修改对象,必须先获得独占锁。只能有一个事务获得对象的独占锁。如果某个事务已经获得了对象的独占锁,则其他尝试获取锁(包括共享锁、独占锁)的事务必须等待,直到加锁成功才能继续执行
解锁阶段:在解锁阶段只能进行解锁操作。
事务要读取对象,必须先获得共享锁,这样防止幻读。事务要修改对象,必须先获得独占锁,这样防止脏写。
两段锁可以这样来实现:事务开始后就处于加锁阶段,一直到执行rollback或commit之前都是加锁阶段。rollback和commit使事务进入解锁阶段,即在rollback或commit时释放持有的锁。
2、一次封锁
一次封锁法遵守两段锁协议。
一次封锁要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
一次封锁存在的问题:
封锁时间被延长,并发度被降低:一次就将以后要用到的全部数据加锁,势必延长了封锁的时间,从而降低了系统的并发度。
不适合用在数据库:一次封锁不适合用在数据库中,因为在事务开始阶段,数据库并不知道会用到哪些数据。
一次封锁的好处:不会出现死锁。
3、两段锁的优劣局限
两段锁的优点/作用:
解决事务并发问题:防止脏写、脏读......
实现可串行化隔离:将两段锁与谓词锁结合使用,可以防止所有形式的写倾斜以及其他竞争条件,实现可串行化隔离
性能和实际串行相比:相比于实际串行来说,使用两段锁时,多个事务可以并发读取同一个对象
性能和一次封锁来比:相比于一次封锁,两段锁的锁定时间更短,事务并发性比一次封锁要好
两段锁的缺点:
性能:使用两段锁,事务吞吐量和查询响应时间相比于其他弱隔离级别下降非常多。部分原因在于锁的获取和释放本身的开销,但更重要的是其降低了事务的并发性。
访问延迟具有非常大的不确定性:假如一个事务需要等待另一个事务释放锁,另一个事务释放锁的时机是不确定的,因此等待它释放锁的耗时是不确定的。
死锁更加频繁:由于两段锁的加锁模式,死锁可能变得更为频繁。因而导致另一个性能问题,即如果事务由于死锁而被强行中止,应用层就必须从头重试,假如死锁过于频繁,则性能和效率必然大打折扣。
数据库系统会自动检测死锁情况,并强行中止其中的一个事务以打破僵局
由于使用了这么多的锁机制,所以很容易出现死锁现象,例如事务A可能在等待事务B释放它持有的锁,而事务B在等待事务A释放它持有的锁。数据库系统会自动检测事务之间的死锁情况,并强行中止其中的一个事务以打破僵局,这样另一个可以继续向前执行。而被中止的事务需要由应用层来重试。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。