spring事务

来源:互联网 发布:linux rar 编辑:程序博客网 时间:2024/05/03 03:43

事务的概念

一组操作,这组操作要么全部成功,要么全部失败。

事务的特性

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性是指事务前后数据的完整性是一致的。
隔离性是指多个用户并发访问数据库时,一个用户的事物不能被其他用户的事物所干扰,多个并发事务之间的数据要相互隔离。
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

spring中有关事务的接口

spring为实现事务提供了一组接口,主要为以下三个接口:
PlatformTransactionManager
TransactionDefinition
TransactionStatus

PlatformTransactionManager


public interface PlatformTransactionManager {    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;    void commit(TransactionStatus var1) throws TransactionException;    void rollback(TransactionStatus var1) throws TransactionException;}


spring为不同的持久化框架提供了不同PlatformTransactionManager,项目中如果使用的jdbc或是ibatis,那么对应的实现类为DataSourceTransactionManager

TransactionDefinition

这个接口定义了一组常量

public interface TransactionDefinition {    int PROPAGATION_REQUIRED = 0;    int PROPAGATION_SUPPORTS = 1;    int PROPAGATION_MANDATORY = 2;    int PROPAGATION_REQUIRES_NEW = 3;    int PROPAGATION_NOT_SUPPORTED = 4;    int PROPAGATION_NEVER = 5;    int PROPAGATION_NESTED = 6;    int ISOLATION_DEFAULT = -1;    int ISOLATION_READ_UNCOMMITTED = 1;    int ISOLATION_READ_COMMITTED = 2;    int ISOLATION_REPEATABLE_READ = 4;    int ISOLATION_SERIALIZABLE = 8;    int TIMEOUT_DEFAULT = -1;    int getPropagationBehavior();    int getIsolationLevel();    int getTimeout();    boolean isReadOnly();    String getName();}


传播行为

    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;

    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;

    int PROPAGATION_NESTED = 6;

传播行为主要是用来解决业务层上出现的相互调用的复杂情况

隔离级别

    int ISOLATION_DEFAULT = -1;                          // 使用后端数据库默认的隔离级别
    int ISOLATION_READ_UNCOMMITTED = 1;    //最低级别
    int ISOLATION_READ_COMMITTED = 2;         //避免脏读  oracle默认的级别
    int ISOLATION_REPEATABLE_READ = 4;       // 避免脏读,不可重复读。mysql默认的级别
    int ISOLATION_SERIALIZABLE = 8;                 //串行事务,不可能出现并发访问的

如果事务不考虑隔离性,会出现脏读,不可重复读,幻读。隔离级别就是用来处理这几个情况的。
脏读:A事务读取了B事务还未提交的数据,B事务回滚了,A事务读取的数据是无效的。
不可重复读:在同一个事务里,多次读取同一个数据返回的结果不同
幻读:一个事务读取到另一个事务的insert语句,导致出现原来没有的记录。

不可重复读和幻读往往区分不清: 可以暂时理解不可重复读是针对update,幻读是针对insert

超时

    int TIMEOUT_DEFAULT = -1;

0 0
原创粉丝点击