3

在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 函数,但这意味着一次只能更新一个圆形/正方形。

感谢您的任何建议。

4

2 回答 2

1

您可以探索一下hibernate version-type field,它可以解决目的,如果您没有使用hibernate,那么可以考虑实现与您的base dao相同的一部分。

如果您需要详细信息,请告知。

于 2013-04-02T04:13:38.160 回答
0

您需要进行悲观和乐观锁定。Spring 支持锁定。请参阅 如何通过 iBatis 防止 UPDATE 中的并发问题

于 2013-04-02T03:10:27.643 回答