Spring 事务管理
什么是事务回滚?
举个例子:比如转账操作,甲先成功汇给乙现金,若乙没能取款成功,那么甲的现金就应该自动退还
Spring提供了很好的事务管理体系


Spring要进行事务管理,首先需要导入以下jar包:
cglib-nodep-2.1_3.jar
org.springframework.transaction-3.1.1.RELEASE.jar



以下是采用注解方式进行事务操作
1.在配置文件里面,首先配置Spring事务管理器:

Spring 事务管理_第1张图片
引用jdbc包下的datasource下的DataSourceTransactionManager
当然,也同样要为它匹配数据源,即dataSource,因为我们要告诉事务管理器它操作的对象数据是谁



2.由于我们是采用注解方式操作事务,所以需要在配置文件中启动事务注解:

Spring 事务管理_第2张图片
transaction-manager属性填写的就是上一步中的事务管理器




3.在需要进行事务管理的具体方法或具体类处进行注解:

Spring 事务管理_第3张图片
在上例中,为这个类标记了@Transactional(rollbackForClassName="RuntimeException")指的是这个类下的所有方法均赋予事务回滚操作
括号中的rollbackForClassName指的是一旦发生了指定异常,就自动进行事务回滚,例如此处指定了RuntimeException
为buy方法标记了:@Transactional(propagation=Propagation.REQUIRES_NEW)指的是赋予这个方法管理事务的标记,若当前类没有做标记而这个方法做了标记,则指只有这个方法可以操作事务
括号中的propagation是指事务的传播行为,默认是REQUIRED,指当这个事务被别的事务调用时,则进入到那个调用的事务中去
若按本例中设置为REQUIRES_NEW则指当这个事务被别的事务调用时,则先进行完当前事务,再进行那个调用的事务


以上可以举个通俗的例子:

比如甲有现金40,现在他买了两本书,一本20元,一本50元,那么他结账时按照正常来说应该是只能买得一本也就是那本20元的,而在事务管理中,结账就是一个事务,单独买每一本书也是一个事务,如果我们设置为REQUIRES,则表示按照结账时的事务来进行,也就是在结账第二本时发现余额不足,则结账事务回滚,导致第一本也买不成。

若我们设置成REQUIRED_NEW,则表示在结账第一本时,就应该先将结账这个整体事务先挂起,然后去调用买第一本书的事务,成功之后,回到整体事务,但是这个时候买第二本书,所以又会进入到买第二本书的事务,发现余额不足,所以买第二本不成功,买第二本回滚,但是不影响已经成功的第一本。所以我们才将其设置为REQUIRES_NEW。


事务回滚所需要的jar包请见文末。