
那么不知道你 对于Spring支持的常用数据库事务传播属性和隔离级别了解得怎么样呢?要不要一起复习复习了:grin:
很喜欢一句话:“八小时内谋生活,八小时外谋发展”
共勉:woman: :computer:
描述:进来先看看风景啦,要相信会有光的哦
对于数据库事务ACID(原子性、一致性、隔离性、持久性)性质我想大家都是知道的,这里就不写了:grin:
我们都知道用事务是为了保证数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
但是如果一个方法嵌套关联着其他方法了,这该怎么算呢?当前方法及关联方法都有事务呢,或者只是其中某几个有事务,该用谁的呢?
事务的传播行为:一个方法运行在一个开启了事务的方法上时,当前方法是使用原来的事务还是开启一个新的事务。
通过 @Transaction注解中propagation来设置事务传播行为。其中
事务传播行为总共有以下七种:
下面写了一个小demo来让理解更加快捷一些哈。
注意:account表中 balance字段是设置为无符号的(即不能为负数)。
项目就是普通Spring项目
模拟的是买书的一个过程,账户余额不足,但是一次买多本的情况,一起付款。
在其中再测试事务传播行为的不同,来看数据的变化。
初始代码:
mapper层代码
测试一:默认事务传播行为
我们在 void checkout(int userId, List isbns) 和void purchase(int userId, int isbn)上都加了@Transactional
目前账户为 100元,两本书的价格分别为 60和50 ,因为我们的付款过程是 使用循环 购买的,你说我们会买到一本还是一本都买不到呢?
答案当然是一本都买不到,因为 @Transactional注解 ,默认事务的传播属性是:REQUIRED,即业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。所以实际上void purchase(int userId, int isbn)其实和调用它的方法用的同一个事务。简单画个图:
测试二:测试 -->REQUIRES_NEW属性
其他代码未改变,仅在 purchase上的注解上加了点东西@Transactional(propagation = Propagation.REQUIRES_NEW).
REQUIRES_NEW: 不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
你说说答案和上面是一样的么?:grinning:
答案是不一样的, 测试一 我们实际上用的就是checkout上的事务,并没有用到 purchase 的事务,从图上也能看出来。
测试二它的事务传播属性 用 图来讲是这样的啦:
所以是可以买到一本书的。
还有很多,意思都解释过了,没有一一测完了。
假设现在有A和B 两个事务 并发执行。
1)脏读:一个事务读取到另一事务未提交的更新新据
2)不可重复读: 同一事务中,多次读取同一数据返回的结果有所不同(针对的update *** 作)
3)幻读:一个事务读取到另一事务已提交的insert数据(针对的insert *** 作)
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
在代码中,我们可以通过
数据库提供了4种隔离级别:
注: 模拟并发情况。
1) 测试一下 mysql 的默认隔离级别:
测试代码特别简单,但因为我是手动模拟,得打断点、debug启动,
当执行完第一个 double bookPrice = bookShopMapper.getBookPriceByIsbn(isbn)语句时,应该去mysql 修改一下书的价格,这样看一下结果。
这个时候再接着执行。看输出什么。
最后的结果仍然是50、50。因为mysql的默认事务隔级别是可重复读,意思在这同一个事务中,可以重复读。
注:因为这是直接修改数据库,其 *** 作行为并不可取,此处只是为了模拟。其结果有时也非一定准确。
关系数据库事务(DatabaseTransaction)是指一个可以包含多个步骤来完成所需要的任务的工作单元。通过事务将一系列不可分割的数据库 *** 作作为一个整体来执行,从而保证了数据库的完整性和有效性。其包含了一组数据库 *** 作命令的一个 *** 作序列,事务中所有命令作为一个整体向系统提交或撤销 *** 作请求(要么完全执行,要么完全不执行,即数据库命令系列要么都成功,要么都不成功)。
2.1.1事务特性数据库事务必须具备ACID特性,一个逻辑工作单元要成为事务,必须满足ACID属性。
ACID是指Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。事务由数据库管理系统(DBMS)中的事务管理子系统负责处理。
1.原子性原子性指的是一个事务(Transaction)中的所有 *** 作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2.一致性一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
3.隔离性隔离性指的是在并发环境中,当不同的事务同时 *** 纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
4.持久性持久性指的是只要事务成功结束,它对数据库所做的更新就必须永久地保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
事务通常由高级数据库 *** 纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。
扩展资料
事务类型
(1)手动事务
手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。
(2)自动事务
.NET 页、XML Web services方法或 .NET Framework 类一旦被标记为参与事务,它们将自动在事务范围内执行。您可以通过在页、XML Web services 方法或类中设置一个事务属性值来控制对象的事务行为。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)