在Spring框架的mySQL上访问和更新数据时遇到一个问题,想请教大家最有效的加锁TABLE行的方法。
假设我有两张表:一张记录所有圆圈及其 id 和位置,另一张记录所有具有相同列的正方形。每个圆圈的位置都可以独立修改,正方形也是如此。但是方块的位置也可以通过移动圆圈的位置来调整。伪代码如下:
Public ShapeMovingService{
@Transaction (isolation=required)
public moveCirclePosition(int id, int newPosition){
//move circle=id to a new position
//also move the square which relates to this circle accordingly
}
@Transaction (isolation=required)
public moveSquarePosition(int id, int newPosition){
//move square=id to a new position
}
}
public CircleDao extends JdbcTemplateSupport{
public updatePosition(int id, int position){
//query a circle from circle TABLE with id
//update the position of the circle
//ALSO: modify the position of the square which relates to this circle
}
}
public SquareDao extends JdbcTemplateSupport{
public updatePosition(int id, int position){
//query a square from squareTABLE with id
//update the position of the square
}
}
我做了几个线程来完成以下任务:
- 两个线程不断更新圈子id=1的位置
- 一个线程不断更新圈子id=2的位置
- 一个线程不断更新方块id=1的位置
- 一个线程不断更新方块id=2的位置
移动 id=2 的圆的位置会影响 id=1 的位置;circle id=1 与其他方格没有关系,方格 id=2 也没有。
我的问题是,我应该在什么时候通过事务注释或同步关键字锁定数据库操作,这样就不会发生数据损坏?然而,不同的圈子仍然可以同时更新。现在我锁定了 updatePosition 函数,但这意味着一次只能更新一个圆形/正方形。
感谢您的任何建议。