java并发下数据更新与插入,请给出示例代码,基础架构为springboot+mybatis+mysql
时间: 2024-02-02 19:04:54 浏览: 98
当涉及到并发下数据更新和插入时,最好使用数据库中提供的事务机制来保证数据的一致性。以下是示例代码:
首先,在 `application.properties` 文件中配置数据源和事务:
```
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driverClassName=com.mysql.jdbc.Driver
# 开启事务
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.auto-commit=false
spring.datasource.hikari.connection-test-query=SELECT 1
# MyBatis 配置
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
mybatis.configuration.jdbc-type-for-null=NULL
```
然后,在你的 `Mapper` 接口中定义数据库相关操作:
```
public interface UserMapper {
// 插入用户
@Insert("insert into user(name, age) values(#{name}, #{age})")
int insertUser(@Param("name") String name, @Param("age") int age);
// 更新用户
@Update("update user set age = #{age} where id = #{id}")
int updateUser(@Param("id") int id, @Param("age") int age);
}
```
最后,在你的业务代码中调用这些方法:
```
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void insertAndUpdateUser() {
// 开始事务
TransactionStatus transactionStatus = TransactionAspectSupport.currentTransactionStatus();
// 插入一条数据
int insertResult = userMapper.insertUser("Alice", 20);
if (insertResult != 1) {
// 插入失败,回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return;
}
// 更新刚刚插入的数据
int updateResult = userMapper.updateUser(1, 21);
if (updateResult != 1) {
// 更新失败,回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return;
}
// 提交事务
transactionManager.commit(transactionStatus);
}
}
```
在上面的代码中,我们使用了 `TransactionManager` 来开启和提交事务,并使用了 `TransactionAspectSupport` 来回滚事务。这样,当有多个线程同时访问时,只有一个线程能够执行到更新或插入数据的代码块,从而保证了数据的一致性。
阅读全文