本地事务:在单体应用中,我们执行多个业务操作使用的是同一个连接,操作同一个数据库,操作不同表,一旦有异常我们可以容易整体凡人回滚
一、
二、事务的四大特征(ACID)
1、原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
如:执行下单这个操作,由保存订单、锁库存、扣积分等子单元组成,三个子单元,哪怕一个子单元出现异常,以他都要回滚,代表这次操作的失败
2、持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3、隔离性:多个事务之间。相互独立。
如:多个人执行下单操作,一个人下单失败事务回滚,并不影响其他人的操作
4、一致性:事务操作前后,数据总量不变
三、事物的4种隔离级别由低到高
1、未提交读(Read uncommitted)
第一个事务执行期间,第二个事务读取了,第一个事务还未提交的数据
2、已提交读(Read committed)
第一个事务执行期间,第二个事务读取了,第一个事务已提交的数据
3、可重复读(Repeatable read)
第一个事务执行期间,只要第一个事务没有执行完,第二事务去读取第一个事务的数据,读取结果都是一样的
4、串行化(Serializable)
第一个事务执行完成后,第二事务才能去读取第一个事务的数据
四、事物的七种传播行为
例子:
@Transactional // a事务
public void a(){
b(); // b事务
c(); // 新事务()
i = 10 / 0;
}
@Transactional(propagation = PROPAGATION_REQUIRED) // 需要一个事务,当前有事务则共享当前的事务,若无则重写创建一个新的
public void b(){
}
@Transactional(propagation = PROPAGATION_REQUIRES_NEW) // 需要一个新事务,无论当前有无事务都要创建一个新的
public void c(){
}
a与b是共享一个事务的,只要a发生异常,a回滚、b也跟着回滚,则c不受影响
五、事物并发带来的问题
1、丢失更新:一个事务的更新覆盖了另一个事务的更新。
2、脏读:一个事务读取了另一个事务未提交的数据。
3、不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致。
4、幻象读:一个事务两次读取一个范围的记录,两次读取的记录数不一致。
六、事物并发问题的解决