事务是一组操做的执行单元,相对于数据库的单条操做而言,事务管理的是一组SQL指令,如增删改查等,事务的特性体如今事务内包含的SQL指令必须所有执行成功,若是其中一条指令发生错误,那么整个事务内的一组操做都要进行回滚。java
事务有四个特性:spring
Spring中并无直接管理事务,而是将管理事务委托给相应的持久化机制提供的某个特定平台的实现。sql
事务管理器实现 | 目标 |
---|---|
org.springframework.jdbc.datasource.DataSourceTransactionManager | 在单一的JDBC Datasource中管理事务 |
org.springframework.orm.hibernate5.HibernateTransactionManager | 当持久化机制是hibernate时,用它来管理事务 |
org.springframework.jdo.JdoTransactionManager | 当持久化机制是Jdo时,用它来管理事务 |
org.springframework.transaction.jta.JtaTransactionManager | 使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用 |
org.springframework.orm.ojb.PersistenceBrokerTransactionManager | 当apache的ojb用做持久化机制时,用它来管理事务 |
Spring关于事务的注解中有如下几个属性(部分)数据库
@Transactional( readOnly = false, //读写事务 timeout = -1, //超时 noRollbackFor = ArithmeticException.class //遇到数学异常不回滚 isolation = Isolation.REPEATABLE_READ, //事务隔离级别 propagation = Propagation.REQUIRED //事务传播规则 )
传播行为 | 意义 |
---|---|
REQUIRED | 业务方法须要在一个事务中运行。若是方法运行时,已经处在一个事务中,那么加入到该事务,不然为本身建立一个新的事务 |
NOT_SUPPORTED | 声明方法不须要事务。若是方法没有关联到一个事务,容器不会为它开启事务。若是方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行 |
REQUIRES_NEW | 属性代表无论是否存在事务,业务方法总会为本身发起一个新的事务。若是方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被建立,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行 |
MANDATORY | 该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起本身的事务。若是业务方法在没有事务的环境下调用,容器就会抛出异常 |
SUPPORTS | 这一事务属性代表,若是业务方法在某个事务范围内被调用,则方法成为该事务的一部分。若是业务方法在事务范围外被调用,则方法在没有事务的环境下执行 |
NEVER | 指定业务方法绝对不能在事务范围内执行。若是业务方法在某个事务中执行,容器会抛出异常,只有业务方法没有关联到任何事务,才能正常执行 |
NESTED | 若是一个活动的事务存在,则运行在一个嵌套的事务中. 若是没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个能够回滚的保存点。内部事务的回滚不会对外部事务形成影响。它只对DataSourceTransactionManager事务管理器起效 |
隔离级别 | 意义 |
---|---|
DEFAULT | 默认的隔离级别 |
READ_UNCOMMITED | 容许你读取还未提交的改变了的数据。可能致使脏、幻、不可重复读 |
READ_COMMITTED | 容许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生 |
REPEATABLE_READ | 对相同字段的屡次读取是一致的,除非数据被事务自己改变。可防止脏、不可重复读,但幻读仍可能发生 |
SERIALIZABLE | 彻底服从事务ACID的隔离级别,确保不发生脏、幻、不可重复读。这在全部的隔离级别中是最慢的,它是典型的经过彻底锁定在事务中涉及的数据表来完成的 |