2012-12-04 93 views
0

我有一个数据库表,它不时得到一个进程的更新。但是,在某些情况下,我想强制覆盖特定的行。有没有一种方法,我可以不写很多代码来处理覆盖等,只是锁定数据库本身的行或字段?有没有办法在MySQL中锁定特定的行和列?

例如,我的表看起来像

STUDENT | TEST_SCORE_AVG | HOMEWORK_AVG 
John |  92.3  |  88.8 
Lisa |  77.4  |  99.8 
Terry |  88.0  |  64.5 

随着每一个新的测试或家庭作业,学生的平均水平会发生变化。然而,说老师是约翰的母亲,无论如何,他的功课平均得分为100.0。有没有办法锁定它,以便任何试图更改该值的程序都会被反弹回来?我使用MySQL的工作台来访问我的MySQL数据库(InnoDB的)

UPDATE:

我也与锁定整行的功能作出应有的 - 这意味着,无论是TEST_SCORE_AVG也不HOMEWORK_AVG所能改变的。无论连接是否丢失,我都需要解决方案持续很长一段时间。我想锁定该行,直到我,否则解锁

+0

母校在学校偏袒吗?说它不是这样! – JYelton

回答

0

不,没有实际方法来防止单个行中的单个值不断变化。

除了使用MySQL以外的任何东西,你可以创建一个CHECK()约束条件来保证John的作业平均总是100,但我不会说那么实际。在MySQL上,你必须使用触发器才能获得相同的功能,但我再也不会这么称呼。

其他答案指的是行级锁定,这实际上与防止单个行中的单个值发生更改无关。

0

manual

InnoDB实现标准行级锁定,其中有两种类型的锁:

  • 一共享(S)锁允许事务读取一行。
  • 独占(X)锁允许事务更新或删除一行。

您可以锁定特定的行,但在一个特定的行列无法锁定。

+0

OP在询问是否可以防止一行中的一个值不断变化。行级锁定与此无关。 –

+0

那么它是如何工作的行?不道德的老师可以通过设置考试和作业成绩来获得。即使在数据库连接关闭之后,我仍然需要该锁持久保存。我想基本上说“使用这个值,直到我告诉你,否则”作为手动覆盖 – sally

+0

@Catcall,它不太​​理想,但我如果它的工作,那么它可能足够好 – sally

相关问题