0

我有一个数据库表,它会不时被进程更新。但是,在某些情况下,我想强制覆盖特定行。有没有一种方法可以不用编写大量代码来处理覆盖等,只需锁定数据库本身中的行或字段?

例如,我的桌子看起来像

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)

更新:

我还可以使用锁定整行的功能来实现 - 这意味着既不能TEST_SCORE_AVG也不HOMEWORK_AVG能改变。无论连接是否丢失,我都需要该解决方案能够长期存在。我想锁定该行,直到我解锁它为止

4

2 回答 2

0

手册

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

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

您可以锁定特定的行,但不能锁定特定的行列。

于 2012-12-04T20:47:44.263 回答
0

不,没有实用的方法可以防止单行中的单个值发生变化。

使用除了 MySQL 之外的任何东西,您都可以创建一个 CHECK() 约束来保证 John 的作业平均数始终为 100,但我认为这并不实用。在 MySQL 上,您必须使用触发器才能获得相同的功能,但我再次认为这并不实用。

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

于 2012-12-04T20:53:26.653 回答