【问题标题】:How to isolate a transaction from any other database operations using @Transactional?如何使用@Transactional 将事务与任何其他数据库操作隔离?
【发布时间】:2012-06-29 14:57:24
【问题描述】:

我有一个场景,如果一个事务为数据库启动,那么在启动的事务被提交或回滚之前不允许读取和更新操作。

例如: 如果我尝试插入一行,那么需要对数据库中已经存在的行进行一些特定的更改,如果任何其他事务或数据库查询在更改完成之前读取数据,那么我们最终会得到错误的值数据库,那么如何控制查询。

我真正想做的是,当一个事务开始时,我想给数据库加个锁,怎么做?

我正在使用 Hibernate 事务(声明性事务)@Transactional(readOnly=false,propagation=Propagation.REQUIRES_NEW) 我可以向事务添加任何其他满足我要求的属性吗?

【问题讨论】:

    标签: hibernate jakarta-ee


    【解决方案1】:

    您不应该这样做。交易彼此隔离运行。在默认隔离级别(大部分时间为 READ_COMMITTED)下,每个事务只看到其他事务已经提交的内容。因此,如果您在事务运行时从数据库读取一个并行事务,则该并行事务在提交之前不会看到主事务的更改。每个事务都会看到数据库的一致快照。

    这在大多数情况下就足够了。如果还不够,您可能希望使用更高的隔离级别(如 REPEATABLE_READ 甚至 SERIALIZABLE,如果您的数据库支持它们),但完全锁定数据库是不可能的,也是不可取的。

    阅读http://en.wikipedia.org/wiki/Isolation_%28database_systems%29 了解有关每个隔离级别保证的更多详细信息,并阅读您的数据库文档以了解它支持哪些级别。

    旁注:@Transactional 是 Spring 注释,而不是 Hibernate。

    【讨论】:

    • SQL 2008 是否支持可序列化?
    猜你喜欢
    • 2015-10-28
    • 2019-03-09
    • 2019-11-28
    • 1970-01-01
    • 2016-09-20
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多