事务使用基础

事务四大特性

原子性:事务操作要么都成功,要么全部回滚。
一致性:事务前后从一个状态变为另一个状态,不存在中间状态。
隔离性:多个事务之间不相互干扰,分为四个等级。
持久性:事务提交后对数据库的影响是持久的。

多个事务并发产生的问题

脏读:一个事务读取到另一个事务未提交的数据。
不可重复读:一个事务多次读取数据,存在不一致的数据。
幻读:一个事务多次读取数据,存在数据的增加或删除。
第一类更新丢失:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
第二类更新丢失:一个事务覆盖另一个事务已提交的更新数据。

事务四种隔离等级

为了解决多个事务并发产生的问题,事务分为四种隔离的等级。
Read uncommitted:无隔离。
Read committed:防止脏读。
Repeatable read:防止脏读,防止不可重复度读。
Serializable:防止脏读,防止不可重复读,防止幻读,防止更新丢失。

Spring事务传播行为

1.PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2.PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
3.PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

对于更新丢失行为的处理

1.悲观锁
悲观锁即事务进行时将资源锁定。会很影响性能。
2.乐观锁
乐观锁可以采用version版本或时间戳进行设置。具体做法为在持久化对象中添加一个int型的version属性,当事务对一条数据进行更新操作后,version+1。事务更新时会验证version,如果数据库中已不存在该version的数据,则回滚数据。Hibernate支持乐观锁,持久化对象存在version属性时,Hibernate会自动更新与验证。

猜你喜欢

转载自blog.csdn.net/KJDynasty/article/details/80035244
今日推荐