Spring中的事务

Spring事务的三大组件

一。platformTransactionManager 事务管理器:负责得到事务状态,提交、回滚事务。

二。TransactionStatus事务状态: 提供了控制事务执行和查询事务状态的方法

三。TransactionDefinition 事务属性定义

1.隔离性:ISOLATION
①读未提交:当前事务可以读取未提交的数据
②读已提交:当前事务只能读取已提交的数据
③可重复读:当前事务内读取统一数据前后值不变
④串行化: 当前事务内读取同一批次数据,不会幻读。
⑤默认隔离级别:与数据库一致;mysql可重复读,oracle读已提交

2.传播性:PROPAGATION
①REQUIRED: 当前方法存在事务则加入事务,不存在则新建事务

②REQUIRES_NEW: 当前方法存在事务,仍然新建一个事务并将当前事务挂起。如果外层事务回滚,当前方法事务不会回滚。如果当前事务异常抛出到外层事务了,但是外层事务捕获了异常,外层事务不会回滚,否则外层事务也会回滚。

③NESTED: 当前方法存在事务则创建一个子事务,否则创建新事物。如果外层事务回滚,则子事务必定回滚。如果子事务异常抛出到外层事务了,但是外层事务捕获了异常,外层事务不会回滚,否则外层事务也会回滚。

④MANDATORY: 如果当前事务存在事务则加入事务,如果不存在事务则会报错。

⑤SUPPORTS: 如果当前事务存在事务则加入事务, 如果不存在事务则继续运行

⑥NOT_SUPPORTED: 如果当前事务存在事务则将当前事务挂起,自己以非事务方式运行。

⑦NEVER: 如果当前不存在事务则正常运行,如果存在事务则报错。

3.回滚规则:rollbackFor,noRollbackFor
默认只有运行时异常才会回滚,可以通过rollbackFor参数指定异常回滚,或者通过noRollbackFor参数指定异常不回滚

4.是否只读:readOnly
将多个查询sql放入同一个事务中,可满足重复读

5.超时时间:timeOut
如果超过该时间仍未执行完成则会回滚,默认是数据库超时时间

注意:
①事务只能用到public方法中
②同一个类中非事务方法调用事务方法事务会失效,因为事务是基于aop实现的,内部调用无法进入切面

编程式事务

/**
 * 事务管理器
 */
@Resource
static PlatformTransactionManager platformTransactionManager;

/**
 * 事务模板
 */
@Resource
static
TransactionTemplate transactionTemplate;

public static void main(String[] args) {
    //定义事务属性:隔离性,传播性等
    DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
    //设置隔离级别
    defaultTransactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
    //设置传播性
    defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    //设置超时时间
    defaultTransactionDefinition.setTimeout(3000);
    //设置是否只读
    defaultTransactionDefinition.setReadOnly(true);
    //获取事务对象
    TransactionStatus transactionStatus = platformTransactionManager.getTransaction(defaultTransactionDefinition);
    //设置回滚规则
    transactionStatus.setRollbackOnly();
    //事务提交
    platformTransactionManager.commit(transactionStatus);
    //事务回滚
    platformTransactionManager.rollback(transactionStatus);



    //使用事务模板
    transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    transactionTemplate.execute(new TransactionCallback<Object>() {
        @Override
        public Object doInTransaction(TransactionStatus transactionStatus) {
            //默认事务提交,事务回滚
            transactionStatus.setRollbackOnly();
            return null;
        }
    });
}

声明式事务

/**
* 基于aop实现的声明式事务
*/
@Configuration
@EnableTransactionManagement
public class DeclarationTransaction {

@Transactional(isolation = Isolation.DEFAULT,
        propagation = Propagation.REQUIRED,
        timeout = 3000,
        rollbackFor = Exception.class,
        readOnly = false)
public void test() {

}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值