最近深感自己技术薄弱,是该冲冲电了,18KW的
陆续会有几篇笔记分别记录 数据库事物基本原理 、 SPRING事物的基本配置 、 DEMO的搭建演示 。
主要分
这篇主要是学习数据库事物基础原理,。
1,数据库事物—基本概念
事物就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询,如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。
2,数据库事物—标准特征(ACID)
Atomicity-原子性:
一个事物必须被视为一个不可分割的最小工作单元,整个事物中的所有操作要吗全部提交,要么全部失败回滚。
Consistency-一致性:
数据库总是从一个一致性的状态切换到另外一个一致性的状态,我的理解就是数据库从一个事物切换到另一个事物。
Isolation-隔离性:
通常情况,一个事物所做的修改在最终提交前,对其他事物是不可见的。
Durability-持久性:
一旦数据提交,则其所作的修改就会永久保存到数据库中(当废话吧)。
3,数据库事物—隔离级别
Read Uncommitted(未提交读) —>Dirty Read(脏读)
未提交读,顾名思义就是事物正在进行,其他事物就读取了其中正在操作的数据,导致了脏读。
Read Committed(提交读)—> nonrepeatable read(不可重复读)
事物完成了,其他事物才能读取被修改的数据,这就导致了另一个执行事物在此事物执行前后查询到的数据会不一样,我们称之为不可重复读。
Read Repeatable(可重复读) —> 解决了脏读,未能避免幻读(Phantom Read)
在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改变。DB是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是DB不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录,导致幻行。
Serializable(可串行化)
事物的最高隔离级别,通过强制事物串行化执行,避免?幻读?(serializable在读取的每一行数据上都加锁-mysql)
4,数据库事物— Spring 事务传播机制
除了事务的传播行为外,事务的其它特性 Spring 是借助底层资源的功能来完成的,Spring 无非只充当个代理的角色。但是事务的传播行为却是 Spring 凭借自身的框架提供的功能
所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring 支持 7 种事务传播行为:
- PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
- PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。
- 多线程:在 相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。
(引自IBM:Spring 事务管理高级应用难点剖析: 第 1 部分)