0

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2012-06-28T07:22:11.887 回答