一、事务的四大特性(ACID):
1、A(原子性 Atomicity):
原子性是指事务必须是一个原子的操作,事务中包含的各项操作在一次执行过程中,要么都发生,要么都不发生
2、C(一致性 Consistency):
一个事务在执行之前和执行之后,数据库都必须处以一致性状态
例如:从A账户转账到B账户,不能因为程序报错或其他原因A账户扣了钱,而B账户没有增加钱
3、I(隔离性 Isolation):
事务的隔离性是指在并发场景中,每个事务之间是互相隔离、互相独立的,一个事务的执行不能被其它事务干扰
4、D(持久性 Durability):
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来(写入磁盘)。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
二、事务的隔离性说明
1、读未提交(READ_UNCOMMITTED)
一个事务还没有提交时,它做的变更就能被别的事务看到。会产生脏读
脏读:一个事务读到另一个事务变更了但未提交的数据
2、读已提交(READ_COMMITTED)
一个事物提交之后,它做的变更才会被其他事务看到。会产生不可重复读
不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样
3、可重复读(REPEATABLE_READ),是MySQL默认隔离级别
一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。会产生幻读
幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行、或者第二次查询的数据和第二次查询的数据结果不一致
4、串行化(SERIALIZABLE)
串行化隔离级别最高也是最安全的级别,不会产生脏读、不可重复读、幻读问题。对于同一行记录,写会加“写锁”、读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行。
事务排队一个一个来,效率最低
三、事务常见失效场景:
1、不适当的事务传播机制,常用的事务传播机制:propagation = Propagation.REQUIRED
2、异常被方法内部捕捉(catch)后,并且没有抛出
3、非public修饰的方法,例如(private、final、static)等
4、当前类没有被Spring IOC容器管理