SQL-事务(2025.6.6-2025.6.7学习篇)

1、简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

2、操作演示

2.1 银行转帐演示

查看/设置事务提交方式:

SELECT @@autocommit;

SET @@autocommit = 0;


select@@autocommit;

查询出来的结果如果是1,则是自动提交。

查询出来的结果如果是0,则是手动提交。


开启事务
START TRANSACTION 或 BEGIN


提交事务--成功:

COMMIT;


回滚事务----失败:

ROLLBACK;

3、四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

4、并发事务问题

5、并发事务演示及隔离级别

5.1模拟两个并发事务

5.2 脏读:未提交的事务

5.3 解决脏读

5.4 不可重复度

5.5 解决不可重复度

5.6 幻读

6、小结

<think>好的,我现在需要解决用户遇到的MyBatis报错“Closing non transactional SqlSession”的问题。首先,我要回忆一下这个错误的常见原因。根据用户提供的引用内容,特别是引用[3]和[4],这个问题通常与Spring事务配置有关。当MyBatis在没有事务的情况下关闭SqlSession时,可能会出现这个警告,而更严重的是可能导致事务不生效,比如回滚失败。 接下来,我需要考虑可能的原因。引用[2]提到在配置了Druid连接池后,每次执行SQL都会创建和关闭SqlSession,这说明可能没有正确配置事务管理器,导致每次操作都使用独立的非事务性会话。正确的配置应该确保SqlSession在事务管理下被重用,而不是每次都新建。 然后,解决方案方面,用户需要检查Spring的配置,特别是事务管理器和MyBatis的集成。根据引用[3],问题可能出在配置文件中,比如是否启用了注解驱动的事务管理,或者是否扫描了正确的包。另外,数据源和SqlSessionFactory的配置是否正确,是否使用了Spring的事务管理数据源,而不是直接使用MyBatis的。 另外,用户可能在代码中没有正确使用事务注解,比如在服务层的方法上添加@Transactional,但可能因为某些配置问题导致注解未被识别。这时候需要确认是否在配置类上添加了@EnableTransactionManagement,或者在XML配置中启用了事务支持。 还需要检查MyBatis的配置,例如SqlSessionTemplate是否正确注入,因为它负责管理SqlSession的生命周期,配合Spring事务。如果直接使用SqlSessionFactory创建SqlSession而没有通过Spring管理,也可能导致这个问题。 此外,用户提到的GlobalExceptionHandler可能和错误处理有关,但主要问题还是事务配置不正确。需要确保异常被正确抛出,以便事务管理器能够捕获并回滚,尤其是在使用@Transactional时,默认只对运行时异常回滚,可能需要设置rollbackFor属性。 总结下来,解决步骤应该是:1.检查并配置事务管理器;2.确保启用注解驱动;3.正确配置SqlSessionFactory和Mapper扫描;4.在服务层方法使用@Transactional;5.验证数据源和连接池配置是否正确。同时,引用[4]提到这可能涉及到事务传播机制的问题,需要确保方法在同一个事务内执行。 最后,生成相关问题需要考虑用户可能遇到的类似问题,比如事务不生效的其他原因、配置检查方法、事务传播机制的影响等,这样可以帮助用户进一步排查和深入学习。</think>### 解决“Closing non transactional SqlSession”错误的步骤 #### 1. 配置事务管理器 确保在Spring Boot配置中正确声明事务管理器,并与MyBatis集成。 ```java @Configuration @EnableTransactionManagement // 启用事务管理[^3] public class MyBatisConfig { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } } ``` #### 2. 检查数据源与SqlSessionFactory配置 确保`SqlSessionFactory`使用Spring管理的数据源,而非独立创建: ```yaml # application.yml mybatis: mapper-locations: classpath:mapper/*.xml configuration: cache-enabled: true spring: datasource: url: jdbc:mysql://localhost:3306/test driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root type: com.alibaba.druid.pool.DruidDataSource ``` #### 3. 使用@Transactional注解 在服务层方法上添加事务注解,确保操作在事务内执行: ```java @Service public class UserService { @Autowired private UserMapper userMapper; @Transactional // 声明事务边界[^4] public void updateUser(User user) { userMapper.update(user); // 若此处抛出异常,事务应回滚 } } ``` #### 4. 验证Mapper扫描配置 确保`@MapperScan`指向正确的包路径,避免MyBatis自行管理SqlSession: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 指定Mapper接口位置 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 5. 检查事务传播机制 若方法嵌套调用,需确认事务传播行为是否符合预期(例如使用`@Transactional(propagation = Propagation.REQUIRED)`)。 --- ### 常见错误原因总结 | 原因 | 解决方案 | 相关引用 | |---------------------|-----------------------------------|----------| | 未启用事务管理 | 添加`@EnableTransactionManagement` | [^3] | | SqlSession未由Spring管理 | 配置`SqlSessionFactoryBean`和`MapperScannerConfigurer` | [^2] | | 数据源配置错误 | 检查Druid连接池与MyBatis集成 | | | @Transactional未生效 | 确保代理模式(如CGLIB)已启用 | | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值