几乎很多面试考官会问事务性是什么,但是知道事务是怎么回事却又说不出详细的。
一、数据库事务性
数据库几乎是所有系统的核心模块,它将数据有条理地保存在储存介质(磁盘)中,
并在逻辑上,将数据以结构化的形态呈现给用户。支持数据的增、删、改、查,并在过程中保障数据的正确且可靠。
类似你去银行ATM去取钱,钱没出来,而余额被扣了!!!
1、首先我们要达到余额不被扣除,那么就先要了解事务的四大特性
* 原子性(Atomicity): 事务要么全部完成,要么全部取消
。 如果事务崩溃,状态回到事务之前(事务回滚)。
* 隔离性(Isolation): 如果2个事务 T1 和 T2 同时运行,事务 T1 和 T2 最终的结果是相同的,不管 T1和T2谁先结束(锁机制)。
* 持久性(Durability): 一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数据库中。
* 一致性(Consistency): 只有合法的数据(依照关系约束和函数约束)才能写入数据库。
2、事务日志
数据库通过事务日志来达到这个目标。 事务的每一个操作(增/删/改)产生一条日志,内容组成大概如下:
- LSN:一个按时间顺序分配的唯一日志序列号,靠后的操作的LSN比靠前的大。
- TransID:产生操作的事务ID。
- PageID:被修改的数据在磁盘上的位置,数据以页为单位存储。
- PrevLSN:同一个事务产生的上一条日志记录的指针。
- UNDO:取消本次操作的方法,按照此方法回滚。
- REDO:重复本次操作的方法,如有必要,重复此方法保证操作成功。
二、SpringBoot声明事务(事务声明详解)
在Spring中,事务有两种实现方式,分别是编程式事务和声明式事务。
编程式事务:编程式事务管理使用Transaction Template或者直接使用底层的Platform TransactionManager。对于编程式事务,Spring推荐使用Transaction Template。TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
声明式事务:声明式事务基于AOP,其本质是对方法前后进行拦截,在方法开始前创建或加入一个事务,再根据目标方法执行的结果决定提交还是回滚事务。只需要在类、方法加上