Spring - Txn

事务的特性

ACID

配置模式

1. 编程式事务管理

即使用TransactionTemplate或者PlatformTransactionManager,显示地将事务操作包裹在其中。如下:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PERSISTENCE_UNIT_NAME");
EntityManager entityManager = entityManagerFactory.createEntityManager();
Transaction transaction = entityManager.getTransaction()
try
{
   transaction.begin();
   someBusinessCode();
   transaction.commit();
}
catch(Exception ex)
{
   transaction.rollback();
   throw ex;
}

2. 声明式事务管理

即使用annotations@,标记需要进行事务操作的method, class, interface(not recomended as not working in some cases)。

声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。

Step 1: Config

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

<tx:annotation-driven proxy-target-class="true" transaction-manager="txManager" />

Step 2: Use

public class SomeDAO {
    @Transactional(propagation= Propagation.REQUIRES_NEW, isolation= Isolation.READ_COMMITTED, readOnly=false)
    public void insert(JdbcTemplate jdbcTemplate) {
        System.out.println("INSERT RECORDS");
        for (int i =0; i<100; i++) {
            System.out.println(i);
            jdbcTemplate.execute(INSERT_SQL);
        }
        System.out.println("INSERT ERROR RECORDS");
    }
}

事务的传播机制 - PROPAGATION

Spring事务传播机制:规定了事务方法发生”嵌套调用”时事务如何进行传播。 举例来说,Service_A中调用了Service_B,这时,由几种情况:

1

2

3

参考 -> https://segmentfault.com/a/1190000020386113

事务的隔离级别 - ISOLATION

并发可能导致的问题:

隔离级别:

链接

Fork me on GitHub