chore[litemall-db]: 写一个乐观锁更新的测试用例
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
package org.linlinjava.litemall.db;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.linlinjava.litemall.db.dao.LitemallSystemMapper;
|
||||
import org.linlinjava.litemall.db.domain.LitemallSystem;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.web.WebAppConfiguration;
|
||||
|
||||
/*
|
||||
main线程先select,然后睡眠1s,最后做update
|
||||
another线程则是先select,然后做update
|
||||
|
||||
main: select update 2
|
||||
another: select update 3
|
||||
|
||||
如果没有乐观锁,那么最后main线程的update操作是成功的,最终数据库保存的值是2;
|
||||
如果设置乐观锁,那么最后main线程的update操作是失败的,最终数据库保存的值是3。
|
||||
|
||||
在一些业务过程中,需要采用乐观锁,这样可以保证数据更新时不会出现问题。
|
||||
*/
|
||||
@WebAppConfiguration
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringBootTest
|
||||
public class OptimisticLockTest {
|
||||
|
||||
@Autowired
|
||||
private LitemallSystemMapper systemMapper;
|
||||
|
||||
private Integer unlockId;
|
||||
private Integer lockId;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
LitemallSystem unlockSystemConfig = new LitemallSystem();
|
||||
unlockSystemConfig.setKeyName("test-unlocksystem-key");
|
||||
unlockSystemConfig.setKeyValue("test-unlocksystem-value-1");
|
||||
systemMapper.insertSelective(unlockSystemConfig);
|
||||
unlockId = unlockSystemConfig.getId();
|
||||
|
||||
LitemallSystem lockSystemConfig = new LitemallSystem();
|
||||
lockSystemConfig.setKeyName("test-locksystem-key");
|
||||
lockSystemConfig.setKeyValue("test-locksystem-value-1");
|
||||
systemMapper.insertSelective(lockSystemConfig);
|
||||
lockId = lockSystemConfig.getId();
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
systemMapper.deleteByPrimaryKey(unlockId);
|
||||
unlockId = null;
|
||||
systemMapper.deleteByPrimaryKey(lockId);
|
||||
lockId = null;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void runWithOptimisticLock() {
|
||||
LitemallSystem mainSystem = systemMapper.selectByPrimaryKey(lockId);
|
||||
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
LitemallSystem anotherSystem = systemMapper.selectByPrimaryKey(lockId);
|
||||
|
||||
anotherSystem.setKeyValue("test-locksystem-value-3");
|
||||
systemMapper.updateWithVersionByPrimaryKey(anotherSystem.getVersion(), anotherSystem);
|
||||
}
|
||||
}).start();
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
mainSystem.setKeyValue("test-locksystem-value-2");
|
||||
int updates = systemMapper.updateWithVersionByPrimaryKey(mainSystem.getVersion(), mainSystem);
|
||||
Assert.assertEquals(updates, 0);
|
||||
|
||||
mainSystem = systemMapper.selectByPrimaryKey(lockId);
|
||||
Assert.assertNotEquals(mainSystem.getKeyValue(), "test-locksystem-value-2");
|
||||
Assert.assertEquals(mainSystem.getKeyValue(), "test-locksystem-value-3");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void runWithoutOptimisticLock() {
|
||||
LitemallSystem mainSystem = systemMapper.selectByPrimaryKey(unlockId);
|
||||
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
LitemallSystem anotherSystem = systemMapper.selectByPrimaryKey(unlockId);
|
||||
|
||||
anotherSystem.setKeyValue("test-unlocksystem-value-3");
|
||||
systemMapper.updateByPrimaryKey(anotherSystem);
|
||||
}
|
||||
}).start();
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
mainSystem.setKeyValue("test-unlocksystem-value-2");
|
||||
int updates = systemMapper.updateByPrimaryKey(mainSystem);
|
||||
Assert.assertEquals(updates, 1);
|
||||
|
||||
mainSystem = systemMapper.selectByPrimaryKey(unlockId);
|
||||
Assert.assertEquals(mainSystem.getKeyValue(), "test-unlocksystem-value-2");
|
||||
Assert.assertNotEquals(mainSystem.getKeyValue(), "test-unlocksystem-value-3");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user