Mybatis事务

首先事务是什么,

事务是要做的事。是并发控制单元,是自定义的操作序列。这些操作要么全部都做,全部都完成,要么全部都不做,全部都失败。

事务的经典场景:

小明向小东转账100快。这包含了“小明账户扣除100”、“小东账户增加100快”两个操作。很显然,这个两个操作必须全部完成,或者全部失败,才能保证一个完整的事务。如果“扣钱”操作成功,但是“加钱”操作失败,那么整个事务就必须回滚rollback。

        事务的四个特征:一致性,原子性,隔离性,持久性

原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚,

一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。如转账业务,无论事务执行成功与否,参与转账的两个账户余额之和应该保持不变。

隔离性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。

持久性:久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

spring事务回滚机制:

受事务控制的方法抛出指定异常,就会发生事务回滚。如果在spring中增加了事务管理,但是事务并没发生回滚,不妨检查一下几点原因:

1,该方法或该方法所在的类是否有@Transactional注解(注解式),或者在applicationContext.xml中配置了事务拦截(拦截式)。

2,该被事务管理的方法是否抛出能够触发事务回滚的异常,并且此异常被事务管理器成功捕捉。默认的情况下,能够触发事务回滚的异常为Error和RuntimeException及其子类那些Unchecked异常。

在一个方法中,如果直接在方法上加throws Exception,当发生异常时,事务正常回滚。

如果异常被try{}捕捉了,在catch{}中没有进行异常抛出。那么事务管理器无法再捕捉到异常,事务不会发生回滚。

如果异常被try{}捕捉了,在catch{}中抛出了自定义异常,throw new RuntimeException(),事务管理器会捕捉到异常,事务正常发生回滚。

值得注意的是,sqlException是Exception的直接子类,属于检查时异常。按理说事务是不会因为SqlException发生回滚。

但是,据大神的亲测得出结论:spring框架对到sqlException进行了重写,当捕捉到此异常后抛出其自定义异常 throw new RuntimeException()。触发事务回滚操作。

手动回滚事务:

1,手动抛出异常 :  throw new RuntimeException();  

2,编程式回滚事务:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  

猜你喜欢

转载自blog.csdn.net/Frog_Demon/article/details/85157717