首页 > 数据库技术 > 详细

数据库事务

时间:2019-11-08 14:48:04      阅读:80      评论:0      收藏:0      [点我收藏+]

前言

事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做。

事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:
    原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
    一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏。
    隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响。
    持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。

多个事务并发执行的问题

丢失更新:
    两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,
    这是由于没有加锁造成的。

脏读:
    一个事务看到了另一个事务未提交的更新数据。

不可重复读:
    在同一事务中,多次读取同一数据却返回不同的结果。

幻读:
    在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,
    即好像发生幻觉一样。

问题解决

未提交读(Read Uncommitted):
    很不安全,
    可能出现丢失更新、脏读、不可重复读、幻读。

提交读(Read Committed):
    一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,
    可能出现不可重复读、幻读;

可重复读(Repeatable Read):
    保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,
    可能出现幻读;

序列化(Serializable):
    最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全。

Spring提供的事务管理

Spring框架最核心功能之一就是事务管理:
    1. 提供一致的编程式事务管理API。
    2. 无侵入式的声明式事务支持。

Spring事务隔离级别

隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:

TransactionDefinition.ISOLATION_DEFAULT:
    这是默认值,表示使用底层数据库的默认隔离级别。
    对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

ISOLATION_READ_UNCOMMITTED(读未提交)

ISOLATION_READ_COMMITTED(读已提交)

ISOLATION_REPEATABLE_READ(可重复读)

ISOLATION_SERIALIZABLE(串行化)

事务传播行为

事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,
此时有若干选项可以指定一个事务性方法的执行行为。
在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

TransactionDefinition.PROPAGATION_REQUIRED(默认):
    必需有(有就不需要新建,而是加入;没有就新建)

PROPAGATION_REQUIRES_NEW:
    每次创建一个新的事务(有则挂起)

PROPAGATION_SUPPORTS:
    可有可无(有就不需要新建,而是加入)

PROPAGATION_NOT_SUPPORTED:
    不能有(有则挂起)

PROPAGATION_NEVER:
    不能用(有则异常)

PROPAGATION_MANDATORY:
    必需有(有就不需要新建,而是加入;没有就异常)

PROPAGATION_NESTED:
    有就嵌套,没有就新建。

内置事务管理器与编程式事务

DataSourceTransactionManager : org.springframework.jdbc.datasource

    用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理。

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

JpaTransactionManager : org.springframework.orm.jpa

    用于集成JPA实现框架时的事务管理。

    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

声明式事务

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>


<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
        <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>
    </tx:attributes>
</tx:advice>


<tx:attributes>
    <tx:method name="……"
            propagation=" REQUIRED"
            isolation="READ_COMMITTED"
            timeout="-1"
            read-only="false"
            no-rollback-for=""
            rollback-for=""/>
</tx:attributes>


@Transactional实现事务管理:

    <tx:annotation-driven transaction-manager="txManager"/>

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, readOnly=true)

事务总结

https://www.cnblogs.com/loveer/p/11471022.html

https://www.cnblogs.com/loveer/p/11471186.html

数据库事务

原文:https://www.cnblogs.com/loveer/p/11819790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!