两个不同的事物是独立的
注意事物的顺序 :例如一个事物是查询一个事物是插入 先执行插入后查询两个事物,
就发生了脏读的可能,
脏读: 一个事物没有提交就被其他事物读取到了 解决方法 提高事物隔离级别 (Read_committed)
不可重复读: 同一个事物中 同一个sql语句查询出来的结果不一样 例如:执行完第一次查询后 执行了insert或者update ,再次执行第一次查询的sql后 两次结果不一致(两个事物是独立的 一个事物两次查询,中间发生了一个插入或者修改的事物,两次查询不同)提高到可重复读(mysql默认是可重复读,oracle和sql server 是以提交读 read committed)
有些时候发现你吧隔离级别提到了REPEATABLE_READ后还是发生了不可重复读,
可能是本来一个查询的事物变成了两个(变成了两个查询事物一个插入事物) 进行select查询会自动提交事物
幻读: 场景--> 注册的时候判断手机号码是否重复,基本的操作是先查询有没有这个号码,没有的话进行插入. 受网络问题,点了第一次注册信息没有反应,然后瞬间多点了很多次,问题就来了 导致了并发的事物 绿色的线代表查询 红丝的代表着插入 并发的事物的时候,两个事物一起去查,发现没有 ,两个事物同时执行了插入,导致插入两次
可串行化 : 就没有并发的操作了 全部排队 不可取
解决办法 : 加锁,对程序的操作
not_supported 不支持当前事物, 当前存在事物 ,会自己在创建事物往下走
method-A 调用了method-B 方法 那么method-B的当前事物就是method-A中的事物
传播机制 就是method-A怎么把事物传给method-B
案例: 分别往user和account表中插入数据 插入顺序是 先调用createUser插入user 然后在调用AddAccount方法插入account 并且AddAccount方法插入有个除零异常
在两个方法中分别加上或不加上或使用不同事物事物 看情况如何
默认的事物如果加上了这个注解 :如果没有事物就创建,如果有就使用当前事物
@Transactional(propagation = Propagation.REQUIRED)
事物: 同一个事物描述: 新建连接和commit中间的操作
新建连接
conn = new Connection
conn.setAutoCommit(false) //自动提交关闭
//curd
conn.commit() or conn.rollback() or conn.close()
下面的图 1 代表成功插入数据, 2 代表失败插入数据
场景3 : 事物的默认传播方式,公用一个事物,当addAccount发生异常时,这个整个事物失败,都不提交
场景4: not_supported 不支持当前事物, 当前存在事物 ,会事物挂起
底层是用aop的操作 实现共享连接