ACID,指数据库事务正确执行的四个基本要素的缩写包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求
原子性
整个事务中的所有 *** 作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
MySQL 事务
什么是事务?
MySQL 事务主要用于处理 *** 作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库 *** 作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有 *** 作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT *** 作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
from 树懒学堂 - 一站式数据知识平台
那么不知道你 对于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 = PropagationREQUIRES_NEW)
REQUIRES_NEW: 不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
你说说答案和上面是一样的么?:grinning:
答案是不一样的, 测试一 我们实际上用的就是checkout上的事务,并没有用到 purchase 的事务,从图上也能看出来。
测试二它的事务传播属性 用 图来讲是这样的啦:
所以是可以买到一本书的。
还有很多,意思都解释过了,没有一一测完了。
假设现在有A和B 两个事务 并发执行。
1)脏读:一个事务读取到另一事务未提交的更新新据
2)不可重复读: 同一事务中,多次读取同一数据返回的结果有所不同(针对的update *** 作)
3)幻读:一个事务读取到另一事务已提交的insert数据(针对的insert *** 作)
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题
一个事务与其他事务隔离的程度称为隔离级别 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
在代码中,我们可以通过
数据库提供了4种隔离级别:
注 : 模拟并发情况。
1) 测试一下 mysql 的默认隔离级别:
测试代码特别简单,但因为我是手动模拟,得打断点、debug启动,
当执行完第一个 double bookPrice = bookShopMappergetBookPriceByIsbn(isbn) 语句时,应该去mysql 修改一下书的价格,这样看一下结果。
这个时候再接着执行。看输出什么。
最后的结果仍然是50、50。因为mysql的默认事务隔级别是可重复读,意思在这同一个事务中,可以重复读。
注 :因为这是直接修改数据库,其 *** 作行为并不可取,此处只是为了模拟。其结果有时也非一定准确。
以上就是关于数据库事务的基本要素有哪些全部的内容,包括:数据库事务的基本要素有哪些、Mysql数据库中,事务是指什么如何使用该功能、Spring支持的常用数据库事务传播属性和隔离级别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)