您的位置:首页 > 数据库

如何理解数据库事务?我的回答是:

2018-03-05 13:42 218 查看

数据库事务(简称‘事务’)

数据库事务是指作为单个逻辑工作单元执行的一系列数据库操作

事务的特性

ACID(Atomicity-原子性;Consistency-一致性;Isolation-隔离性;Durability-持久性)

原子性:把整个事务执行看作一个不可再分的原子,也就是整个事务里的操作要么全部执行,要么都不执行(回滚-ROLLBACK)

一致性:事务开始前和结束后,数据库原有的物理约束和逻辑约束保持一致(物理约束-外键,非空、唯一性约束等;逻辑约束-根据自己的业务逻辑而定,由开发人员保证)

隔离性:在并发环境下,各个事务执行过程中应该是相互隔离的。换句话说,如果两个事务同时操作同一条数据,事务1看到的数据要么是事务2修改之前的,要么是事务2修改之后的,不会看到事务2修改中间状态的数据

持久性:一旦事务提交,事务的所有的操作就都在数据库里面生效了,数据持久存在。(事务执行中,临时数据会保存到事务日志文件中,以便提交或回滚)

最重要的隔离级别

隔离级别由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

-Read uncommitted 读未提交



可以读取另一事务未提交的数据,违背了隔离性的原则,出现脏读;

脏读:事务1读取到了事务2的中间状态数据,事务2有可能再次修改此数据或回滚,导致事务1读取到的这个数据是脏数据;

-Read committed 读提交(Sql Server , Oracle默认隔离级别)



只能读取到另一个事务开始前或提交后的数据,解决脏读,出现不可重复读;

不可重复读:由于事务2的修改操作,事务1对同一数据的两次读取结果不一致;

-Repeatable-Read 重复读(mysql默认隔离级别)



开始读取操作时,不再允许另一事务修改数据,但是允许新添数据,解决不可重复读,出现幻读;

幻读:由于事务2的新增操作,事务1的两次读取操作结果数量不一致,无缘无故多出了一条,就像出现幻觉一样;

-Serializable 序列化执行



所有事务依序执行,没有并发,当然就不存在其他的并发问题,但是效率较低,对数据库的性能消耗也较大,通常不建议使用;

Read uncommittedRead committedRepeatable readSerializable
脏读VXXX
不可重复读VVXX
幻读VVVX

传播行为

1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。

3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: