并发N个线程去修改同一表的同一字段,在加了事务的情况下能不能保证数据库的数据正确。
比如A表的b字段值为1,同时并发100个线程并且是分布式应用,50个将b字段+1,另外50个将b字段-1,会不会造成b最终不等于1呢?

解决方案 »

  1.   

    如果事务控制没出错,那就肯定是正确的。另一种方案是将操作下推数据库,也就是直接写:
    Update TABLE Set b = b + 1 Where ID = 123123这种即便Spring不做事务控制,也肯定是正确的,因为大多数数据库默认的事务隔离级别就能保证。
      

  2.   


    事务应该是没错的,因为修改数据后如果抛出异常,它不会提交。修改数据的时候我用的都是spring默认的事务配置,只设定了回滚异常和事务超时时间。
      

  3.   

    我为了确保万无一失,更新数据库的时候还用了LOCK TABLE,这样是不是多余了?我用的是mysql innodb
      

  4.   


    确实多余,行锁就够了。如果你的场合无法将操作下推数据库,就用 Select xxxx For Update 这种行锁就行了,不过你直接声明事务也可以的。
      

  5.   


    因为是分布式应用,所以程序同步并不能保证数据的有效性,但是都使用了spring的事务,事务是数据库的功能,只要使用了事务,不同的应用操作同一个数据库,应该是可以保证数据有效性的哦?
      

  6.   


    因为是分布式应用,所以程序同步并不能保证数据的有效性,但是都使用了spring的事务,事务是数据库的功能,只要使用了事务,不同的应用操作同一个数据库,应该是可以保证数据有效性的哦?
      

  7.   


    因为是分布式应用,所以程序同步并不能保证数据的有效性,但是都使用了spring的事务,事务是数据库的功能,只要使用了事务,不同的应用操作同一个数据库,应该是可以保证数据有效性的哦?