`
flyPig
  • 浏览: 139834 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Transaction

    博客分类:
  • DB
阅读更多
事务具有四个特性
1. 原子性(Atomic):一个事务中所有对数据库的操作是一个不可分割的操作序列。这些操作要么完整的被全部执行,要么一步也不做。是一个逻辑工作单位。
2.一致性(Consistency):一个事务独立执行的结果将保持一致性,即数据不会因为事务的执行而遭受破坏。
3.隔离性(Isolated):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4.持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

数据库并发性问题
脏读(dirty read):脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有commit到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。而后第一个事务又回滚了修改,则第二个事务持有的就是脏数据。

解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

丢失更新(lost updates):当两个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。如图,事务A的操作就被事务B给覆盖掉了。

解决办法:对数据行加锁,只允许同时进行一个更新事务。

不可重复读(Unrepeatable read):是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。如图,事务A内两次读取,结果就不一样了。

解决办法:如果只有在修改事务B提交之后事务A才可以读取数据,则可以避免该问题。

幻读(phantom read):第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据或者删除已有数据,则可避免该问题.

幻读和不可重复的区别在于
不可重复读是对要读的数据修改,导致同一事务内两次的读取结果不一致。
幻读是对表内的数据作insert/delete,导致同一事务内,两次select的结果记录数目有多或者少。

事务的隔离级别:
ISOLATION_READ_UNCOMMITTED(未提交读):这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。

ISOLATION_READ_COMMITTED(提交读): 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。它会锁定正在读取的行。

ISOLATION_REPEATABLE_READ(可重复读):这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读。它会锁定所读取的所有行。

ISOLATION_SERIALIZABLE(序列化): 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。它会锁住整个表。

事务的传播属性
PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。这是最常见的选择方式。
PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:它们都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。
使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务commit后,外层事务不能对其进行rollback。两个事务之间互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED时,需要JDBC 3.0以上驱动及1.4以上的JDK版本支持。其它的JTA TrasactionManager实现可能有不同的支持方式。

一个自己画的简陋的状态图:
  • 大小: 7 KB
  • 大小: 9.6 KB
  • 大小: 9.1 KB
  • 大小: 9.1 KB
  • 大小: 27.6 KB
分享到:
评论

相关推荐

    javax.transaction-api-1.2-API文档-中文版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    javax.transaction-api-1.2-API文档-中英对照版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    javax.transaction.jar

    【javax.transaction.jar】是Java平台上的一个核心组件,主要用于处理分布式环境中的事务管理。这个库包含了一组接口和类,这些接口和类定义了事务管理的API,使得开发者能够在Java应用程序中实现事务处理的规范。在...

    Principles of transaction processing

    根据提供的文件信息,可以提炼出以下与“Principles of transaction processing”相关的知识点: 1. 事务处理的原理 事务处理系统是计算机系统的一个重要组成部分,它涉及到如何高效、安全地处理各种事务。事务处理...

    CALL TRANSACTION USING... 参数祥解

    CALL TRANSACTION USING 参数详解 CALL TRANSACTION USING 语句是 ABAP 中提供的一个方便的执行批量输入的语句,使用它可以通过程序代码完成多个事务码的连续执行。BDC_TAB 是批输入任务表,网上有很多例子了,大家...

    Springboot 集成Tcc-transaction1

    字段包括事务ID(TRANSACTION_ID)、业务领域(DOMAIN)、全局事务ID(GLOBAL_TX_ID)、分支事务ID(BRANCH_QUALIFIER)、事务内容(CONTENT)、状态(STATUS)、事务类型(TRANSACTION_TYPE)、重试次数(RETRIED_...

    TCC-Transaction分布式事务DEMO

    在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC(Try-Confirm-Cancel)是一种补偿型的分布式事务处理模式,主要由三...

    IEEE-transaction模板.doc

    【IEEE TRANSACTION模板】是用于准备提交给IEEE Transactions和Journals的论文的标准格式指南。这篇文档主要介绍了如何使用Microsoft Word 6.0或更高版本来编写符合标准的论文,并且提供了对于LATEX用户的相关信息。...

    Distributed Transaction Processing The XA Specification.pdf

    3. 事务管理器(Transaction Manager):负责协调全局事务的整个生命周期,包括协调事务分支的提交或回滚,以及处理故障恢复。 4. 资源管理器(Resource Manager):负责管理对单一数据资源的访问,例如数据库、...

    usb transfer&transaction&packet 关系

    ### USB Transfer、Transaction与Packet的关系解析 #### 一、引言 在USB(Universal Serial Bus)规范中,传输(Transfer)、事务(Transaction)以及数据包(Packet)是三个核心概念,它们之间的关系对于理解USB...

    C#中调用Transaction

    本文将深入探讨“C#中调用Transaction”的相关知识点,包括事务的基本概念、事务的特性、如何在C#代码中创建和管理事务,以及与数据库交互时事务的应用。 ### 1. 事务基本概念 事务是数据库操作的一组逻辑单元,它...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    HibernateSession , Transaction 研究

    本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...

    Java Transaction Design Strategies.pdf

    ### Java Transaction Design Strategies知识点概述 #### 一、引言 《Java Transaction Design Strategies》是一本专注于Java事务设计的专业书籍,由Mark Richards编写。本书详细介绍了Java应用程序中的事务处理...

    Could not roll back Hibernate transaction.doc

    Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的...

    PCIE处理层协议(Transaction Layer Specifications)

    处理层协议( transaction Layer specification transaction Layer specificationtransaction Layer specificationtransaction Layer specification transaction Layer specificationtransaction Layer ...

Global site tag (gtag.js) - Google Analytics