Hibernate 事务传播和隔离属性

这篇博客探讨了Hibernate中的事务传播行为,包括REQUIRED、REQUIRES_NEW等7种传播属性,以及它们在Spring框架中的应用。同时,文章详细解释了事务的隔离级别,如DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,分析了不同级别下可能出现的并发问题及其影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务传播属性:

事务传播行为可以由事务属性propagation指定,Spring定义了7种传播行为,这些行为在org.springframework.transaction.TransactionDefinition接口中定义。

REQUIRED:如果现有的事务正在进行,当前方法应该在这个事务中运行,否则,它应该启动新事务,并在自己的事务中运行。

REQUIRES_NEW:当前方法必须启动新事物,并在自己的事务中运行,如果现有的事务正在进行,它应该挂起。

SUPPORTS:如果现有事务正在进行,当前方法应该运行在该事务中,否则,它没有必要运行在事务中。

NOT_SUPPORTED:当前方法不应该运行在事务中。如果现有事务正在运行,它应该挂起。

MANDATORY:当前方法必须运行于一个事务中,如果没有事务在进行中,将抛出一个异常。

NEVER:当前方法不应该运行于事务中,如果现有事务在运行中,将抛出异常。

NESTED:如果现有事务正在运行,当前方法应该运行在嵌套的事务中,否则它应该启动一个新事务并运行在自己的事务中,这种功能是Spring特有的。该行为对于批处理等情况有用,在这种情况下,你需要处理很长的处理过程,而你希望在批处理中每次提交大量的记录,所以你每隔10000个记录提交一次,如果出现某种错误,你回滚嵌套的事务,仅仅丢失10000条记录。


隔离事务属性:

当相同应用或不同应用的多个事务同时在同一数据集上操作时,可能发生许多不可预期的问题。你必须指定事务互相隔离的预期方式。

理论上,事务应该完全互相隔离。但是,这种隔离级别对性能有很大的影响,因为事务必须顺序运行。事实上,事务可以运行于较低的隔离级别,以便改进性能。

事务的隔离级别可以由isolation事务属性指定。Spring支持5中隔离级别。

DEFAULT:使用底层数据库的默认隔离级别。对于大部分数据库,默认隔离级别是READ_COMMITTED;

READ_UNCOMMITTED:允许事务读取其他事务的未提交修改。可能发生读脏数据、不可重复读和幻读问题;

READ_COMMITTED:仅允许事务读取其他事务已提交的修改。能避免读脏数据问题,但是不可重复读和幻读问题仍然可能发生。

REPEATABLE_READ:确保事务能够多次从一个字段读到相同值。在本事务期间,其他事务的更新被禁止。能避免读脏数据和不可重复读问题,但是幻读问题仍然可能发生。

SERIALIZABLE:确保一个事务能从表中多次读取相同的行。在事务期间,其他事务做出的对表的插入、更新和删除将被禁止。能避免所有并发性问题,但是性能很很低。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值