本系列由以下文章组成:
Spring事务(1):概述
Spring事务(2):事务管理器
Spring事务(3):事务属性之隔离级别(isolation level)
Spring事务(4):事务属性之7种传播行为
Spring事务(5):编程式事务
Spring事务(6):声明式事务
并参考摘录以下文章内容进行整理:
http://www.mamicode.com/info-detail-1248286.html
http://blog.youkuaiyun.com/owen_william/article/details/51815605
事务介绍
事务一般发生在和持久层打交道的地方,比如数据库。
假设一个工作由两件事共同组成,那么这两件事要么全部完成,这个工作才算完成。要么全部回退到初始状态。不存在只完成一件,还有一件事没完成的。这项工作可称为一个事务。常用的场景就是银行转账。A向B转账100元这项工作由两件事组成:A帐户减100元,B账户加100元。这两件事要么同时完成,要么同时都回退到初始状态。如果只完成其中一件,另一件没完成,那就出岔子了。。
事务有四个特性:ACID
- 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
- 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
- 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
- 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
Spring事务支持
Spring可以使用编程式事务,也可以使用声明式事务。不过一般用的多的是用声明式。
Spring使用AOP生成一个代理对象来支持声明式事务,使得我们无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。
比如,我们声明了一个事务方法methodTest()
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void methodTest() {
// do something
}
当调用
main{
methodTest();
}
相当于执行(只是举个例子,伪代码。不同的事务管理器内部实现都不同)
Main{
Connection con=null;
try{
con = getConnection();
con.setAutoCommit(false);
//方法调用
methodTest();
//提交事务
con.commit();
}
Catch(RuntimeException ex){
//回滚事务
con.rollback();
}
finally{
//释放资源
closeCon();
}
}