有没有办法锁定MySQL中的特定行和列?

时间:2012-12-04 20:41:26

标签: mysql database

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

例如,我的表格看起来像

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_AVGHOMEWORK_AVG都不会被更改。无论连接是否丢失,我都需要解决方案持续很长一段时间。我想锁定行,直到我解锁它

2 个答案:

答案 0 :(得分:0)

来自manual

  

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

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

您可以锁定特定行,但无法锁定特定行列。

答案 1 :(得分:0)

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

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

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