spring数据库操作一致性问题

同行们,本人菜鸟,有个问题想问下,希望不吝赐教!
比如数据有条记录,如果我需要修改这条记录的余额balance字段,为了防止并发操作的影响,是不是得先加锁,
java代码执行sql顺序是不是这样的:

 select balance from table where id=1 for update;
double money = getBalance(sql);
//一些业务代码
update table set balance=money-100 where id=1;

这是jdbc代码这样写的,
如果用spring的话,也是类似吗?这个和隔离级别有关系吗,需要手工加上for update吗,没看懂spring是如何控制这种操作的

这个跟spring没关系吧,spring主要是控制事物的吧,比如update出错了,对数据库进行回滚。但具体的并发主要还是靠数据库锁或java代码同步来控制吧
。你上面的代码第一行for update是使用的数据库的行锁,也就是在你这三行代码执行并提交事物前,都不会释放锁,因此其他事物就不能对这一行进行更新,所以是安全的。
但如果你没有使用数据库的锁 ,那你这3行代码要同步操作,因为money查询之后可能会被别人修改,所以update可能会更新成脏数据。但代码加锁不能阻止你直接登录数据库操作修改字段的值,所有要确保所有修改操作都是通过代码进行,这样通过代码进行加锁才安全。
如果可以,这样写更安全update table set balance=money-100 where id=1 and money = money;

不管怎么样,要保证一致性都是通过锁来控制的,代码锁或数据库锁,再等等看有没有专家帮你

一般不建议加for update,会有很大的性能问题;
可以在表上加一个字段 rowVersion(乐观锁),每次更新的时候加上这个这个条件:
update table set balance=money-100 where id=1,rowVersion=#{rowVersion};

1,使用update table set value = value+Y where id=''; 的方式进行更新。这样做的方式是在一个事务中减少了一次查询,仅仅进行了一次更新操作,多事务并发时候,由于update操作对该条记录加锁,其他事务会等待直至本事务结束,不会出现数据并发问题,相对2,减少理我锁定时间,增强了系统的并发水平。
2,普通的单应用并发,使用关键字synchronized就可以实现。
3,Mysql中的有两种方法:select…for update或lock in share mode。

Select...for update的实现方式:

      set autocommit =0;//关闭自动提交

      begin;//开始事务

      select * from order where id=989879 for update;//查询信息

      update order set name='names';//修改信息

      commit;//提交事务

执行select…for update时,一般的SELECT查询则不受影响。

Lock in share mode的是实现方式:

      set autocommit =0;//关闭自动提交

      begin;//开始事务

      select * from order where id=989879 lock in share mode;//锁定查询的字段

      update order set name='names';//修改信息

      commit;//提交事务

lock in share mode或select…for update是在事务内起作用的,涉及行锁的概念。能保证当前session事务锁定的行不被其他session所修改。前者属于共享锁,允许其他事务添加共享锁,不允许其他事务修改或者加排它锁。后者属于排它锁,不允许其他事务添加共享锁和排它锁,也不允许修改。

一般情况下推荐使用select…for update。使用lock in share mode时需要注意死锁的问题,就是如果两个session同时对一行加锁,那么将无法执行修改,必须等一个session退出以后才能执行。如果有两个session加锁后同时修改一行,那么将有一个session被引擎强制关闭并重启,这样另一个session的修改就可以顺利执行。如果只有一个session修改,另一个session不做修改动作,那么这个尝试修改的session将会一直等待锁被释放才能继续执行。

综上所有结合1和2就可以简单的实现呢

框架只能保证单个简单事务的完整性,但不能保证事务执行的顺序性。可以用其他方式来控制执行顺序