mysql 事务代码示例
时间: 2023-09-22 08:12:15 浏览: 41
以下是一个简单的 MySQL 事务代码示例:
```
START TRANSACTION;
UPDATE table1 SET column1=value1 WHERE id=1;
UPDATE table2 SET column2=value2 WHERE id=2;
COMMIT;
```
在这个示例中,事务从 `START TRANSACTION` 开始,并在 `COMMIT` 时结束。在事务期间,两个 `UPDATE` 语句被执行。如果任何一个语句失败,事务将被回滚并且没有修改将被保存。
相关问题
MySQL数据库事务代码示例结合springcloudAlibaba和mybatis
下面是一个MySQL数据库事务的代码示例,结合了springcloudAlibaba和mybatis:
1. 配置数据源
在application.yml中配置数据源信息:
```yaml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
```
2. 注入SqlSessionFactory
通过MybatisAutoConfiguration自动配置SqlSessionFactory,并注入到Spring容器中:
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class MybatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}
}
```
3. 定义Mapper接口
创建Mapper接口,定义事务需要执行的数据库操作:
```java
@Mapper
public interface UserMapper {
@Insert("insert into user(name,age) values(#{name},#{age})")
void addUser(User user);
@Update("update user set age=#{age} where id=#{id}")
void updateUser(User user);
@Delete("delete from user where id=#{id}")
void deleteUser(Long id);
}
```
4. 定义Service层
在Service层中注入UserMapper,并使用@Transactional注解标注事务方法:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void addUser(User user) {
userMapper.addUser(user);
}
@Transactional
public void updateUser(User user) {
userMapper.updateUser(user);
}
@Transactional
public void deleteUser(Long id) {
userMapper.deleteUser(id);
}
}
```
5. 调用Service层方法
在Controller中调用UserService中的方法:
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/addUser")
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@PutMapping("/updateUser")
public void updateUser(@RequestBody User user) {
userService.updateUser(user);
}
@DeleteMapping("/deleteUser/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
```
这样,当调用Controller中的方法时,将会执行UserService中的事务操作,保证数据的一致性和完整性。
mysql行级锁 代码示例
MySQL中的行级锁可以通过使用SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE语句来实现。这两个语句都可以锁定查询结果中的行,以防止其他事务修改该行数据。
下面是一个示例代码,演示如何使用SELECT ... FOR UPDATE语句锁定行:
```
-- 建立测试表
CREATE TABLE test_table (
id INT PRIMARY KEY,
value VARCHAR(10)
);
-- 插入测试数据
INSERT INTO test_table (id, value) VALUES (1, 'foo'), (2, 'bar');
-- 执行事务,锁定id=1的行
START TRANSACTION;
SELECT * FROM test_table WHERE id=1 FOR UPDATE;
-- 在此期间,其他事务无法修改id=1的行
COMMIT;
```
在上面的示例中,我们首先创建了一个名为test_table的测试表,并插入了两行数据。接下来,我们启动一个事务,并使用SELECT ... FOR UPDATE语句查询id=1的行。该语句将锁定查询结果中的id=1的行,以防止其他事务修改该行数据。在事务提交之前,其他事务无法修改id=1的行。
注意,使用SELECT ... FOR UPDATE语句只会锁定查询结果中的行,并不会锁定整个表。如果您需要锁定整个表,请使用LOCK TABLES语句。此外,使用行级锁可能会导致死锁问题,需要谨慎使用。