• Spring事务_1


    事务:指逻辑上一组操作,这组操作要么全部成功,要么全部失败。

    事务的特性:

    1 原子性:食物是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    2 一致性:事务执行前后数据的完整性必须保持一致

    3 隔离性 :多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干烧,多个并发事务之间数据要相互隔离。

    4 持久性:一个事务一旦被提交,它对数据库的中的数据的改变就是永久性的,及时数据库发生故障也不会有影响。

    ===============================================================

    3-1 Spring接口介绍
    ·Spring事务管理高层抽象主要包括3个接口
    ·PlatformTransactionManager事务管理器
    ·TransactionDefinition事务定义信息(隔离,传播,超时,只读)
    ·TransactionStatus事务具体运行状态

    ---3-2 PlatformTransactionManager接口介绍--------------------------------------------------------------------------------------------------------------

    ·PlatformTransactionManager事务管理器

    Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现

    org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或IBatis进行持久化数据时使用
    org.springframework.orm.hibernate3.HibernateTransactionManager    使用Hibernate3.0版本进行持久化数据时使用
    org.springframework.orm.jpa.JpaTransactionManager     使用JPA进行持久化数据时使用
    org.springframework.jdo.JdoTransactionManager      当持久化机制是Jdo时使用
    org.springframework.transaction.jta.JtaTransactionManager  使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

    ---3-3 TransactionDefinition定义事务隔离级别--------------------------------------------------------------------------------------------------------------

    TransactionDefinition定义事务隔离级别

    不考虑隔离性,会引发安全问题如下:
    脏读,不可重复读,幻读
    脏读:一个事务读取了另一个事务改写但是还未提交的数据,如果这些数据被回滚,则读到的数据时无效的。
    不可重复读:在同一个事务中,多次读取同一数据返回的结果有所不同
    幻读(虚读):一个事务读取了几行记录后,另一个事务插入一些记录幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

    事务隔离级别TransactionDefinition.ISOLATION_

    DEFAULT        :  默认隔离级别(对大多数数据库来说就是ISOLATION_ READ_COMMITTED(Oracle),Mysql采用REPEATABLE_READ)
    READ_UNCOMMITTED  :  最低的隔离级别。(可能防止脏读,但不可重复读,幻读可发生)事实上我们不应该称其为隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改
    READ_COMMITTED  :  大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入或更新的数据。这意味
    着在事务的不同点上,如果其他事务修改了数据,你就会看到不同的数据
    REPEATABLE_READ    :  比ISOLATION_READ_COMMITTED更严格,该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数
    据集,即使其他事务修改了所查询的数据。(对相同字段多次读取时一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可发生)然而如果其他事务插入了新数据,你就可以查询到该新插入的数据
    SERIALIZABLE  :  (完全服从ACID的隔离级别,确保不发生脏读,不可重复读,幻读)代价最大、可靠性最高的隔离级别,所有的事务都是按顺序一个接一个地执行。

    ---3-3 TransactionDefinition定义事务传播行为--------------------------------------------------------------------------------------------------------------

    propagation 美 [ˌprɑpəˈɡeʃən]n. 宣传;传播

    mandatory美 [ˈmændətɔ:ri] adj. 强制的;命令的;受委托的 n.受托者

    事务传播行为:解决业务层方法之间的相互调用问题

     操作在一个事务中

    1.PROPAGATION_REQUIRED
    如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

    2.PROPAGATION_SUPPORTS
    支持当前事务,如果当前没有事务,就以非事务方式执行。

    3.PROPAGATION_MANDATORY
    使用当前的事务,如果当前没有事务,就抛出异常。

     保证操作不在一个事务中

    4.PROPAGATION_REQUIRES_NEW
    如果当前存在事务,把当前事务挂起,新建一个事务。

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

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

    嵌套事务(aaa设置保存点,如果bbb发生异常,可以回滚到保存点或者最初始状态)
    7.PROPAGATION_NESTED
    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    ---3-5 TransactionStatus接口介绍--------------------------------------------------------------------------------------------------------------

    TransactionStatus接口

    FROM:http://www.cnblogs.com/fengchaowang/p/4122579.html

    如代码清单16-2所示,TransactionStatus接口可以让事务管理器控制事务的执行,可以检查事务是不是一个新事务,或者是否只读。TransactionStatus还可以初始化回滚操作。

    代码清单16-2 TransactionStatus 声明

     

    TransactionStatus接口中的方法很容易理解;最引人注目的就是setRollbackOnly(),它将一个事务标识为不可提交的。换句话说,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。在大多数情况下,事务管理器会检测到这一点,在它发现事务要提交时会立刻结束事务。代码清单16-3中的伪代码说明了这一点。

    代码清单16-3 setRollbackOnly()方法的使用

     

    在调用完setRollbackOnly()后,大多数数据库可以继续执行下一条select语句,但不允许执行update语句--执行update是没有意义的,因为事务只可以进行读取操作,任何修改都不会被提交。

    Method Summary
     boolean hasSavepoint()
              Return whether this transaction internally carries a savepoint, that is, has been created as nested transaction based on a savepoint.
     boolean isCompleted()
              Return whether this transaction is completed, that is, whether it has already been committed or rolled back.
     boolean isNewTransaction()
              Return whether the present transaction is new (else participating in an existing transaction, or potentially not running in an actual transaction in the first place).
     boolean isRollbackOnly()
              Return whether the transaction has been marked as rollback-only (either by the application or by the transaction infrastructure).
     void setRollbackOnly()
              Set the transaction rollback-only.

    ---3-4 --------------------------------------------------------------------------------------------------------------

    ---3-4 --------------------------------------------------------------------------------------------------------------

    ---3-4 --------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    R-CNN学习笔记
    Numpy和Pandas
    用python解决打标签时将xml文件的标签名打错
    爬虫Ⅱ:scrapy框架
    爬虫Ⅰ:爬虫的基础知识
    Linux学习笔记
    MySql笔记Ⅱ
    MySql笔记Ⅰ
    Qt数据库报错:“Unable to execute statement”
    Qt数据库报错“out of memory Error opening database“
  • 原文地址:https://www.cnblogs.com/charles999/p/6673058.html
Copyright © 2020-2023  润新知