Hibernate之锁机制
声明:小弟最近在学习hibernate,下面内容是自己的一些理解,如果有不对的地方请及时留言告知,以免误导了后面的hibernate学习者,谢谢大家配合。
事务:
概念:多个数据库原子访问应该绑定成一个整体——这就是事务
简单来说就是对一个业务逻辑进行操作,要么都成功,要么都失 败。
特性:(ACID)
原子性:
事务执行的最小执行单位,不可再分割。
一致性:
数据操作前后的一致,例如A向B转账1000元,A和B应该在操 作后数据总和保持不变,一致性通过原子性保证。
隔离性:
各个事务的执行互不干扰,就是并发执行的事务间不能互相影响。
持久性:
事务一旦提交,对数据所做的操作应该永久保持到存储器中。
不考虑隔离性产生的问题:
脏读:
一个事务读到了另一个事务没提交的数据。
不可重复读:
在一个事务内,两次读取到的数据不一致。(用于update语句)
虚读(幻读):
在一个事务内,两次读取到的数据不一致(用于insert语句 )
事务的隔离级别:
read uncommitted:(读未提交):最低级别,以上情况均 无法避免
read committed:(读提交) 可避免脏读情况的发生
repeatable read:(可重复读) 可避免脏读、重复读的情 况
Serializable:(串行化)可避免脏读,不可重复读,虚读的 情况
但是执行效率随安全级别的升高而降低
设置隔离级别:
每个数据库连接都有默认的隔离级别,通常是读已提交或可重复读.可以通过数据库配置设置,也可在应用程序中设置.例如Hibernate:
hibernate.connection.isolation = 4
1—Read uncommitted isolation
2—Read committed isolation
4—Repeatable read isolation
8—Serializable isolation
乐观锁:
概念:
乐观锁相对悲观锁而言,采取了更加宽松的加锁机制,乐观锁,大多是基于数据版 ( Version )记录机制实现
如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数 据
丢失更新肯定不发生,添加表字段
优点:
乐观锁机制避免了长事务中的数据库加锁开销(操作员 A和操作员 B 操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的 系 统整体性能表现。
缺点:乐观锁机制往往基于系统中的数据存储逻辑由于乐观锁机制是在我们的 系统中实现,来自外部系统的用户余额更新操作不受我们系统的控制, 因此可能会造成脏数据被更新到数据库中
实现:
1.基于属性:
添加一个 Version 属性描述符
注意: version 节点必须出现在 ID 节点之后、映射文件之中,name名称可 自定义。
Version字段必须与映射文件中的name名称一致
2.基于timestamp配置:
配置文件配置:
实现类中配置:
3.为遗留项目添加乐观锁:
<class name="" table="" optimistic-lock="all">
all表示所有字段为版本信息
悲观锁:
概念:
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
如果使用悲观锁,那么lazy(懒加载)无效