[英]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。
您应该能够在正常选择中使用组合来执行此操作
它很可能会奏效。 不同平台提供不同的服务。 例如,在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.