悲观锁:
通过使用for update语句来实现悲观锁。在Hibernate中使用悲观锁很容易,但实际中缺很少使用,因为大大限制了并发性,并且利用数据库底层来维护锁,大大降低了运行程序的效率。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
乐观锁:
大多数基于数据版本version记录机制实现。在字段中设置一个version字段,每更新时,就会增加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
几种事务隔离级别:
丢失更新;
两个事务同时更新一行数据,但第二个事务却中途失败退出,导致对数据的两个修改都失效了,这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离。
脏读:
又称无效数据的读出。事务T1将某一值修改,然后事务T2读取改值,此后T1因为某种原因撤销对该值的修改,这就导致T2所读取的数据是无效的。
不可重复读:
一个事务对同一个行数据重复读取两次,但是却得到了不同的结果。例如在两次读取的中途,有另外一个事务对它进行修改提交。
两次更新问题:
不可重复读的特例。有两个并发事务同时读取一行数据,然后第一个对它进行修改提交,而另一个也进行了修改提交,这就造成第一次写操作是无效的。
虚读:
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的。
Hibernate悲观锁、乐观锁 以及事务隔离级别
最新推荐文章于 2021-11-03 20:53:51 发布