繁体   English   中英

这会阻止在交易期间读取行吗?

[英]Would this prevent the row from being read during the transaction?

我记得一个例子,其中读取事务然后写回数据是不安全的,因为另一个事务可能在它之间的时间读/写它。 所以我想检查日期并防止行被修改或读取,直到我的交易完成。 这会诀窍吗? 是否有任何sql变种,这将不起作用?

update tbl set id=id where date>expire_date and id=@id

注意:date> expire_date恰好是我的条件。 它可能是任何东西。 这会阻止其他事务在我提交或回滚之前读取行吗?

它取决于您在事务控件上设置的事务隔离级别。 有4种类型的读取

READ UNCOMMITTED: this allows the dirty read
READ COMMITTED 
REPEATABLE READ
SERIALIZABLE

有关更多信息,您可以检查msdn。

您应该能够在正常选择中使用组合来执行此操作

HOLDLOCK / ROWLOCK

它很可能会奏效。 不同平台提供不同的服务。 例如,在T-SQL中,您可以简单地设置事务的隔离级别,从而强制获取锁定。 我不知道你正在使用什么平台,所以我无法明确地回答你的问题。

在很多情况下,UPDATE语句不会阻止其他事务读取行。

ziang提到了事务隔离级别。

根据隔离级别,数据库使用不同类型的锁定。 在最高级别,锁定可以分为两类:
- 悲观,
- 乐观

例如,MS SQL 2008有6个隔离级别,其中4个是悲观的,2个是乐观的。 默认情况下,它使用READ COMMITTED隔离级别,该级别属于悲观类别。

另一方面,Oracle默认使用乐观锁定。

锁定你的写作记录的声明是

SELECT * FROM TBL WITH UPDLOCK WHERE id=@id

从那时起,没有其他事务能够使用id = @id更新您的记录并且只有在隔离级别READ UNCOMMITTED中运行的事务才能读取它。

使用默认事务级别READ COMMITTED,在您提交或回滚整个事务之前,其他任何事务都无法读取或写入此记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM