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

发布于 2022-09-01 17:42:56 字数 75 浏览 16 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

他夏了夏天 2022-09-08 17:42:56

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

但现在假设你有个方法是

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文