关于隔离级别这篇说的最好了:
http://singo107.iteye.com/blog/1175084
我补充的是更新丢失的问题。
当然 所有事务串行情况下不可能出现这个问题。
但就像文章说的 Serializable级别几乎在实际项目中是不会出现的。
先看更新丢失的场景吧:其实都不用绝对并发就会出现。
比如同一件商品被在2个请求中分别被购买1件, 请求A取出库存是100,大于等于1,那么可以购买。请求B比请求A慢2秒进来,取出库存也是100,OK,也可以购买。
这时候经过大量的业务处理,比如花费了3秒钟,A把商品库存修改为 100-1 =99;
2秒后紧接着B也会执行完业务逻辑,修改库存也是把读到的库存减去1 100-1 =99。
很显然,正确结果应该是98。这就所谓的更新丢失,先更新的没起到作用(如果2次是修改不同字段,就是丢失)。
在非 Serializable 级别下,怎么解决这个问题呢。
悲观锁方法:悲观锁是数据库实现的,查询的时候在sql语句最后加上 for update关键字,会在读之后把这条锁住。其他事务甚至都不能读!其实相当于还是把事务弄成串行。。。很显然高并发下完全不可行。
乐观锁方法:乐观锁其实由程序来实现,每条记录修改后都带一条版本号,假如请求A读取到100的版本号是1,那么修改的时候检查下,当前版本号和读的版本号是不是一致,一致的话,可以修改。 修改成99后立即把该条记录的版本号变成2。
这时候B请求呢,发送修改命令的时候,提供的版本号还是1,和当前版本号2对不上,不允许修改。。。
用的CAS方法,其实这个方法极其常用,比如svn。。。
乐观锁的缺点。它不是数据库级别的,假使有另外一套程序也来操作这个数据,就管不了。
为什么第一种方法叫悲观锁呢,因为他认为,每一次读数据都可会冲突,但是这终究还是少数情况。所以说他的世界观悲观。。。乐观锁就乐观多了。
恩,就补充这么多。
分享到:
相关推荐
在处理并发问题时,Hibernate提供了悲观锁和乐观锁两种机制。 悲观锁假设并发环境中的冲突是常态,因此在读取数据时就立即锁定,直到事务结束才释放。在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`...
并且,在使用悲观锁时,要注意合理设置事务的隔离级别,以避免脏读、幻读等现象。 在实际应用中,选择使用乐观锁还是悲观锁,需要根据具体的业务场景和并发需求来定。如果业务操作大部分时间不会出现并发冲突,乐观...
总的来说,数据库的锁机制是确保数据一致性的重要工具,理解并合理使用乐观锁和悲观锁,可以帮助我们设计出更高效、更稳定的数据库应用程序。在数据库设计时,应充分考虑并发控制策略,根据业务特点选择合适的锁类型...
总的来说,数据库隔离级别的选择是一个权衡过程,需要在数据一致性、并发性和性能之间找到合适的平衡点。在设计数据库系统和应用程序时,理解这些隔离级别及其可能产生的效果至关重要,以便做出最佳决策。
乐观锁的实现不需要数据库级别的锁定,降低了数据库资源的消耗,但可能导致更多的事务回滚。 总结来说,悲观锁适合于冲突概率较高的场景,确保数据的独占访问;而乐观锁适用于冲突较少的情况,提高了并发性能。...
锁可以从性能上分为乐观锁和悲观锁,从对数据库操作的类型分为读锁和写锁,从对数据操作的粒度分为表锁和行锁。表锁每次操作锁住整张表,开销小,加锁快,但锁定粒度大,发生锁冲突的概率最高,并发度最低。 在实际...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
乐观锁和悲观锁是数据库事务控制中的两种基本策略,它们在多用户并发环境下处理数据冲突时发挥着重要作用。了解这两种锁机制是每个IT专业人士,尤其是软件开发者和DBA的必备知识,尤其对于准备面试的人来说更是关键...
在数据库中,这两种策略通常可以通过事务隔离级别来实现,如SQL的SELECT ... FOR UPDATE语句实现悲观锁,而乐观锁可以通过版本字段或时间戳来实现。在分布式系统中,还可以使用分布式锁等技术来实现这两种锁的逻辑。
1. **事务隔离级别**:乐观锁和悲观锁与数据库的事务隔离级别密切相关。例如,读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)这四种隔离级别都会...
锁可以分为乐观锁和悲观锁。乐观锁是通过版本对比来实现的,悲观锁是通过加锁来实现的。悲观锁可以分为表锁和行锁,表锁是对整个表加锁,行锁是对某一行数据加锁。悲观锁还可以分为读锁和写锁,读锁是共享锁,写锁是...
在数据库系统中,为了保证数据的一致性和完整性,有多种并发控制策略,其中包括乐观锁和悲观锁。这两种锁机制主要用于解决事务在并发环境中的数据冲突问题。 乐观锁是一种假设事务在执行过程中不会发生冲突的策略。...
2. 使用乐观锁或悲观锁机制。 3. 使用 Row-Level locking 机制。 4. 避免使用长事务和大量的锁定对象。 5. 使用 Index 机制来提高查询效率。 Sybase 数据库锁机制和锁表查询是数据库管理系统中非常重要的组件,可以...
在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 Hibernate 的隔离机制和锁机制。 Hibernate 的隔离机制 Hibernate 的隔离机制是基于数据库的事务隔离级别的。 Hibernate 提供了四种...