事务:指逻辑上一组操作,这组操作要么全部成功,要么全部失败。
事务的特性:
1 原子性:食物是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2 一致性:事务执行前后数据的完整性必须保持一致
3 隔离性 :多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干烧,多个并发事务之间数据要相互隔离。
4 持久性:一个事务一旦被提交,它对数据库的中的数据的改变就是永久性的,及时数据库发生故障也不会有影响。
===============================================================
3-1 Spring接口介绍
·Spring事务管理高层抽象主要包括3个接口
·PlatformTransactionManager事务管理器
·TransactionDefinition事务定义信息(隔离,传播,超时,只读)
·TransactionStatus事务具体运行状态
---3-2 PlatformTransactionManager接口介绍--------------------------------------------------------------------------------------------------------------
·PlatformTransactionManager事务管理器
Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或IBatis进行持久化数据时使用
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3.0版本进行持久化数据时使用
org.springframework.orm.jpa.JpaTransactionManager 使用JPA进行持久化数据时使用
org.springframework.jdo.JdoTransactionManager 当持久化机制是Jdo时使用
org.springframework.transaction.jta.JtaTransactionManager 使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用
---3-3 TransactionDefinition定义事务隔离级别--------------------------------------------------------------------------------------------------------------
TransactionDefinition定义事务隔离级别
不考虑隔离性,会引发安全问题如下:
脏读,不可重复读,幻读
脏读:一个事务读取了另一个事务改写但是还未提交的数据,如果这些数据被回滚,则读到的数据时无效的。
不可重复读:在同一个事务中,多次读取同一数据返回的结果有所不同
幻读(虚读):一个事务读取了几行记录后,另一个事务插入一些记录幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。
事务隔离级别TransactionDefinition.ISOLATION_
DEFAULT : 默认隔离级别(对大多数数据库来说就是ISOLATION_ READ_COMMITTED(Oracle),Mysql采用REPEATABLE_READ)
READ_UNCOMMITTED : 最低的隔离级别。(可能防止脏读,但不可重复读,幻读可发生)事实上我们不应该称其为隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改
READ_COMMITTED : 大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入或更新的数据。这意味
着在事务的不同点上,如果其他事务修改了数据,你就会看到不同的数据
REPEATABLE_READ : 比ISOLATION_READ_COMMITTED更严格,该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数
据集,即使其他事务修改了所查询的数据。(对相同字段多次读取时一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可发生)然而如果其他事务插入了新数据,你就可以查询到该新插入的数据
SERIALIZABLE : (完全服从ACID的隔离级别,确保不发生脏读,不可重复读,幻读)代价最大、可靠性最高的隔离级别,所有的事务都是按顺序一个接一个地执行。
---3-3 TransactionDefinition定义事务传播行为--------------------------------------------------------------------------------------------------------------
propagation 美 [ˌprɑpəˈɡeʃən]n. 宣传;传播
mandatory美 [ˈmændətɔ:ri] adj. 强制的;命令的;受委托的 n.受托者
事务传播行为:解决业务层方法之间的相互调用问题
操作在一个事务中
1.PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
2.PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
保证操作不在一个事务中
4.PROPAGATION_REQUIRES_NEW
如果当前存在事务,把当前事务挂起,新建一个事务。
5.PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
嵌套事务(aaa设置保存点,如果bbb发生异常,可以回滚到保存点或者最初始状态)
7.PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
---3-5 TransactionStatus接口介绍--------------------------------------------------------------------------------------------------------------
TransactionStatus接口
FROM:http://www.cnblogs.com/fengchaowang/p/4122579.html
如代码清单16-2所示,TransactionStatus接口可以让事务管理器控制事务的执行,可以检查事务是不是一个新事务,或者是否只读。TransactionStatus还可以初始化回滚操作。
代码清单16-2 TransactionStatus 声明
TransactionStatus接口中的方法很容易理解;最引人注目的就是setRollbackOnly(),它将一个事务标识为不可提交的。换句话说,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。在大多数情况下,事务管理器会检测到这一点,在它发现事务要提交时会立刻结束事务。代码清单16-3中的伪代码说明了这一点。
代码清单16-3 setRollbackOnly()方法的使用
在调用完setRollbackOnly()后,大多数数据库可以继续执行下一条select语句,但不允许执行update语句--执行update是没有意义的,因为事务只可以进行读取操作,任何修改都不会被提交。
Method Summary | |
---|---|
boolean |
hasSavepoint() Return whether this transaction internally carries a savepoint, that is, has been created as nested transaction based on a savepoint. |
boolean |
isCompleted() Return whether this transaction is completed, that is, whether it has already been committed or rolled back. |
boolean |
isNewTransaction() Return whether the present transaction is new (else participating in an existing transaction, or potentially not running in an actual transaction in the first place). |
boolean |
isRollbackOnly() Return whether the transaction has been marked as rollback-only (either by the application or by the transaction infrastructure). |
void |
setRollbackOnly() Set the transaction rollback-only. |
---3-4 --------------------------------------------------------------------------------------------------------------
---3-4 --------------------------------------------------------------------------------------------------------------
---3-4 --------------------------------------------------------------------------------------------------------------