Spring中的@Transactional注解能够替代synchronized关键字的功能吗?
在service中更新数据库中的记录,能通过Transactional注解保证操作安全吗?
或者说能通过事务的隔离取代锁的存在吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在service中更新数据库中的记录,能通过Transactional注解保证操作安全吗?
或者说能通过事务的隔离取代锁的存在吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
Transactional的意思是在这次操作(从transaction.begin开始算,大概是真正的方法被调用前)如果有错误发生,所有的SQL写操作不会被执行,这保证了数据的写一致性,不会出现有些需要整体一起做完的事情只做一半的情况。
但现在假设你有个方法是
此时如果有两个线程同时进入,并且都是获取同一个用户,那么就可能会出现问题,因为线程2在线程1
save
前已经获得了count,最终count只加了1,此时就会出现读不一致的情况。要解决这种场景就需要用到锁了,在线程1执行中就不能进入这个方法中getUser()
。同时,反过来说锁实际不能解决写一致性的问题,这两个保证的操作安全是不一样的