/**
* 账户B原来金额1350;mysql默认隔离级别:repeatable_read
**/
@Transactional
public void accountOperate(Long account) {
// step1: 账户B金额加50
accountDao.increase(Account.builder().accountName("B").accountNum(account).build());
// step2: 读取账户B金额:accountNum = 1400
Account account = accountDao.query((Account.builder().accountName("B").build()));
// 系统抛出runtimeException,spring事务回滚;数据库账户B金额依旧为1350
int a = 1 / 0;
}
Question:
1. step1中的代码执行完,数据库update操作到底有没有提交事务?
2. 若Step1中执行完数据库提交了事务账户B为1400,那后续spring事务回滚,数据库事务又做了哪些操作?(个人感觉这种假设不成立,因为DB一旦提交事务改变将永远保存在数据库,就没有之后的回滚的说法)
3. 若Step1中没有提交事务,那么step2中读取的数据1400属于Step1未提交数据,在mysql默认的隔离级别下是不允许赃读的,那这个1400又该如何解释?