首页 > Spring中的@Transactional注解能够替代synchronized关键字的功能吗?

Spring中的@Transactional注解能够替代synchronized关键字的功能吗?

在service中更新数据库中的记录,能通过Transactional注解保证操作安全吗?
或者说能通过事务的隔离取代锁的存在吗?


Transactional的意思是在这次操作(从transaction.begin开始算,大概是真正的方法被调用前)如果有错误发生,所有的SQL写操作不会被执行,这保证了数据的写一致性,不会出现有些需要整体一起做完的事情只做一半的情况。

但现在假设你有个方法是

User user = getUser();//从数据库中获取某某用户
user.count = user.count + 1; //count就是数据库中的一个int
save(user);

此时如果有两个线程同时进入,并且都是获取同一个用户,那么就可能会出现问题,因为线程2在线程1save前已经获得了count,最终count只加了1,此时就会出现读不一致的情况。要解决这种场景就需要用到锁了,在线程1执行中就不能进入这个方法中getUser()

同时,反过来说锁实际不能解决写一致性的问题,这两个保证的操作安全是不一样的

【热门文章】
【热门文章】