我正在使用Java Spring应用程序使用Spring Hibernate ORM进行MYSQL DBMS的数据管理。我有一个简单的要求--当有人使用我的应用程序时,我会将我数据库中的一个计数器增加1,这样我就可以跟踪我的用户的使用计数。
我这里有两个简单的实现我想讨论一下,一个给我一个在高负载下的乐观锁异常(我创建了一个多并发用户的模拟来测试负载),一个没有。有人能指导我理解这些差异,这些行为背后的原因,以及数据的正确性是否得到保证吗?
这里是我的第一个代码示例。在压力测试下,抛出OptimisticLockException。
@Transactional
public void updateLog() {
ConnectionUseLog log = getLog();
log.setCount(log.getCount() + 1);
// ... other unrelated updates to database
}
@Data
public class ConnectionUseLog {
@Version
@Column(name="optlock_version")
Integer version;
@Column(name="count")
Integer count;
}
@Transactional
public void updateDailyLog() {
incrementCount(1);
// ... other unrelated updates to database
}
我不知道为什么您认为@transactional
会使您的OptimisticLockingException
消失。乐观锁定完全是关于不同事务的并发性。
它的工作方式是在每个事务中增加一个版本,并检查更新版本是否与加载实体时相同。
在高负载情况下,这通常会因以下一系列事件而失败:
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html
乐观锁Version 要使用乐观锁,需要使用version标记 type User struct { Id int64 Name string Version int `xorm:"version"` } 在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值。 var user User engine
本文向大家介绍Java并发问题之乐观锁与悲观锁,包括了Java并发问题之乐观锁与悲观锁的使用技巧和注意事项,需要的朋友参考一下 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再
我使用SpringDataJPA和Hibernate作为PostgreSQL上的持久性提供者。我试图提供悲观锁定: 我尝试从两个线程中调用< code>findOneAndLock。我认为,如果< code >线程A锁定了对象,那么< code >线程B应该等到锁被释放。而是< code >线程B抛出< code > org . spring framework . ORM . objectopt
我知道使用版本列的Hibernate乐观锁定适用于并发更新。当记录被同时删除和重新插入时,它是否有效?