原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
使用方式
编程式事务
TransactionTemplate:
transactionTemplate.execute(new TransactionCallback<Boolean>){
@Override
public Boolean doInTransaction(TransactionStatus status){
}
}
PlatformTransactionManager
DefaultTransactionDefinition:
defaltTransactionDefinition.setReadOnly(false);
defaltTransactionDefinition.setIsolationLevel(TransactionDefinition.xxx)
defaltTransactionDefinition.setPropagationBehavior(TransactionDefinition.xxx)
TransactionStatus status = transactionManager.getTransaction(def);
try{
transactionManager.commit(status)
}catch(Exception e){
transactionManager.rollback(status);
}
声明式事务
AOP(面向切面编程)
<aop:config>
<aop:pointcut id="id" expression="" />
<aop:advisor pointcut-ref="id" advice-ref="advice">
</aop:config>
<tx:advice id="advice">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
IoC(控制反转)
@Transactional
事务传播的类型
- PROPAGATION_REQUIRED。默认,如果有事务则加入,没有则新建。
- PROPAGATION_REQUES_NEW。有则挂起,当前事务先执行,然后执行挂起的事务,没有则只执行当前事务。
- PROPAGATION_SUPPORT。如果有事务则加入,没有则以非事务方式提交。
- PROPAGATION_NOT_SUPPORT。不支持事务,如果有事务则将其挂起,执行当前程序,没有则直接执行程序,异常情况下不会回滚。
- PROPAGATION_NEVER。不支持事务,有事务则抛出异常。
- PROPAGATION_MANDATORY。如果没有事务则抛出异常。
- PROPAGATION_NESTED。保存状态保存点,各自独立回滚。
事务隔离级别
- ISOLATION_DEFAULT。使用后端默认的隔离级别。
- ISOLATION_READ_UNCOMMITED。允许未提交读,可能导致脏读(没提交的变更被读取)、幻读(一个事务修改全部数据,一个事务新增数据,发现没有全部修改)、不可重复度(事务对同一条件的数据读取两次,两次结果不一样,过程中有事务修改记录)。
- ISOLATION_READ_COMMITED。提交读,存在幻读和不可重复读。
- ISOLATION_REPEATABLE_READ.可重复读,可防止脏读和不可重复读,有可能发生幻读。
- ISOLATION_SERIALIZABLE.序列化,可防止不发生脏读,不可重复读,幻读。