【Spring 事务管理】
数据库事务是由一系列的动作组成的,这些动作被当作单独的一个工作单位。这些动作要么被全部完整执行,要么全部不被执行。事务管理是关系数据中一个重要的部分,
企业级应用使用事务来保证数据的完整性和一致性,可以使用以下四个属性来描述事务
1 原子性
一个事务应该被当作一个单独的操作单位被执行,也就是说这一连串的操作被执行成功或者不成功。
2 一致性
这个代表数据库参照完整性的一致性,表中存在唯一主键
3 隔离性
在同一个时刻可能会有多个事务的进程操作同一个数据集,每一个事务应该同其他的事务隔离,防止数据被篡改
4 持久性
一旦事务被执行成功,事务的结果需要被持久化,并且不能因为系统错误导致数据丢失
一个真正的关系型数据库管理系统会为每一个会话保证上面四个特性,可以通过以下SQL实现
开始一个会话通过使用 Begin Transaction 命令
通过批量执行多个 delete, update,insert 操作
如果所有的操作被执行,则执行commit操作,否则执行rollback操作。
Spring 框架在事务管理的API之上提供了一个抽象层,Spring的事务支持的目的在于通过添加事务的能力到POJO来提供一个可选的EJB事务。
Spring 提供编程式事务和声明式两种事务管理,EJB需要一个应用服务器,但是Spring事务管理能够被实现而不需要应用服务器。
本地事务 和 分布式事务
本地事务特定于单个事务型资源,例如JDBC连接,而分布式事务能够在分布式系统中跨多个事务性资源
编程式事务 和 声明式事务
编程式事务管理: 通过编程的方式来管理事务,这种提供了极度的灵活性,但是很难去维护。
声明式事务管理: 你需要从业务代码中分离事务管理,你只能通过annotations 或者 基于XML的配置来管理事务。
事务隔离级别:
COMMITTED: 脏读能够被阻止,不可重复读和幻读会发生
UNCOMMITTED: 脏读,不可重复读,和幻读会发生
REPEATABLE_READ 脏读和不可重复读能被阻止,幻读会发生
SERIALIZABLE 脏读,不可重复读,幻读被阻止