Skip to content

Commit 49976d3

Browse files
authored
Merge pull request #18 from lookingatstarts/fix-transaction-isolation-bug
修复bug: 事务的隔离级别不对,从DEFAULT(mysql的REPEATABLE_READ)改成READ_COMMITTED
2 parents 3b51faa + 0de6f1d commit 49976d3

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

tinyid-server/src/main/java/com/xiaoju/uemc/tinyid/server/service/impl/DbSegmentIdServiceImpl.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.slf4j.LoggerFactory;
1111
import org.springframework.beans.factory.annotation.Autowired;
1212
import org.springframework.stereotype.Component;
13+
import org.springframework.transaction.annotation.Isolation;
1314
import org.springframework.transaction.annotation.Transactional;
1415

1516
import java.util.concurrent.atomic.AtomicLong;
@@ -28,12 +29,16 @@ public class DbSegmentIdServiceImpl implements SegmentIdService {
2829

2930
/**
3031
* Transactional标记保证query和update使用的是同一连接
32+
* 事务隔离级别应该为READ_COMMITTED,Spring默认是DEFAULT(取决于底层使用的数据库,mysql的默认隔离级别为REPEATABLE_READ)
33+
* <p>
34+
* 如果是REPEATABLE_READ,那么在本次事务中循环调用tinyIdInfoDAO.queryByBizType(bizType)获取的结果是没有变化的,也就是查询不到别的事务提交的内容
35+
* 所以多次调用tinyIdInfoDAO.updateMaxId也就不会成功
3136
*
3237
* @param bizType
3338
* @return
3439
*/
3540
@Override
36-
@Transactional
41+
@Transactional(isolation = Isolation.READ_COMMITTED)
3742
public SegmentId getNextSegmentId(String bizType) {
3843
// 获取nextTinyId的时候,有可能存在version冲突,需要重试
3944
for (int i = 0; i < Constants.RETRY; i++) {

0 commit comments

Comments
 (0)