。全部都加
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
import
1. Spring数据库事务管理器的设计
在Spring中数据库事务是通过PlatformTransactionManager进行管理的。TransactionTemplate源码:
事务的创建、提交和回滚都是通过PlatformTransactionManager接口来完成,当事务产生异常时会回滚事务。在默认的实现中所有的异常都会回滚,我们可以通过配置去修改在某些异常发生时回滚或者不回滚事务。当无异常时会提交事务。
PlatformTransactionManager接口的源码:
1.配置事务管理器
首先
事务开启后,在commit之前,只是将其内容写入日志,commit后才
会真正写入数据库。
那么,如果
一个事务没有
提交,此时别的
事务能读取到它的内容吗?是可以的,在于数据库
事务的隔离级别,
mysql默认下为read repeatable,是不能读取未
提交的内容的,将其设置为read uncommitted即可。
这是否意味着
事务可以不
提交呢?先不说read uncommitted
会带来很多危害(脏读等),
事务如果不
提交,也只能短时间的让别的
事务读取。原因在于数据库连接关闭后,
事务做的内容就
会丢失。
公司的一哥们在使用事务时未进行commit,链接断开后数据库执行了回滚操作,导致线上直播相关库的部分数据丢失,本文通过mysql命令行模拟该事故,并提供解决该问题的思路。希望对大家有帮助。
一、场景模拟
二、紧急处理
三、原因分析
四、相关命令
1、查看正在执行的事务
2、查看正在锁的事务
3、查看等待锁的事务
4、查看所有的线程列表
5、定位未提交的事务执行的sql语句
对于
MySQL 事务,需要在代码
中使用 JDBC API 来控制
事务的开始、
提交和
回滚等操作。具体步骤如下:
- 获取数据库连接:使用 DriverManager 或 DataSource 获取数据库连接。
-
开启事务:调用 Connection 对象的 setAutoCommit(false) 方法,将自动
提交设置为 false,即
开启事务。
- 执行数据库操作:在
事务中执行一组数据库操作,可以使用 PreparedStatement 或 Statement 对象来执行 SQL 语句。
-
提交事务或
回滚事务:如果所有的数据库操作都执行成功,调用 Connection 对象的 commit() 方法
提交事务;如果任何
一个数据库操作失败,调用 Connection 对象的 rollback() 方法
回滚事务。
- 关闭数据库连接:无论
事务执行成功或失败,都需要关闭数据库连接。
2.
Spring 事务配置
对于
Spring 事务,可以使用声明式
事务或编程式
事务来实现
事务的控制。具体步骤如下:
- 声明式
事务配置:在
Spring 配置文件
中配置
事务管理器(TransactionManager)和
事务通知(TransactionAdvice),并在需要控制
事务的方法上添加
事务注解(@Transactional)。
- 编程式
事务配置:在代码
中使用 TransactionTemplate 或 PlatformTransactionManager 等
Spring 提供的
事务 API 来手动控制
事务的开始、
提交和
回滚等操作。
以上是
MySQL 事务和
Spring 事务的基本配置方法,具体实现方式还要根据实际的业务需求和技术栈来进行选择和优化。