public void saveSpittle(Spettle spittle){
spitterDao.saveSpittle(spittle);
}
public void saveSpittle(Spettle spittle){
txTemplate.execute(new TransactionCallback(){
try{
spitterDao.saveSpittle(spittle);
}catch(RuntimeException e){
txStatus.setRollbackOnly();
throw e;
}
return null;
}
});
}
传播行为
|
含义
|
PROPAGATION_MANDATORY
|
表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 |
PROPAGATION_NESTED
|
表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与 PROPAGATION_REQUIRED 一样。 |
PROPAGATION_NEVER
|
表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常。 |
PROPAGATION_NOT_SUPPORTED
|
表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用 JTATransactionmanager的话,则需要访问 TransactionManager
|
PROPAGATION_REQUIRED
|
表示当前方法必须运行在事务中。如果当前事务存在,方法将会在事务中运行。否则,会启动一个新的事务。 |
PROPAGATION_REQUIRES_NEW
|
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用
JTATransactionmanager的话,则需要访问 TransactionManager
|
PROPAGATION_SUPPORTS
|
表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行
|
隔离级别
|
含义
|
ISOLATION_DEFAULT
|
使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED
|
允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读 |
ISOLATION_READ_COMMITTED
|
允许读取并发事务已经提交的数据。可以阻止脏读,但是幻读或不可重复读仍有可能发生
|
ISOLATION_REPEATABLE_READ
|
对同一字段的多次读取结果是一致的,除非数据是被本事务自己所修改的。可以阻止脏读和不可重复读,但幻读仍有可能发生。
|
ISOLATION_SERIALIZABLE
|
完全服从 ACID 的隔离级别,确保阻止脏读、不可重复读以及幻读。这是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的
|
事务属性 |
含义
|
isolation
|
指定事务的隔离级别
|
propagation
|
定义事务的传播规则
|
read-only
|
指定事务为只读
|
回滚规则: rollback-for no-rollback-for |
rollback-for 指定事务对于哪些检查型异常应当回滚而不提交
no-rollback-for 指定事务对于哪些异常应当继续运行而不回滚
|
timeout
|
对于长时间运行的事务定义超时时间
|
@Transactional(propagation=Propagation.SUPPORTS,readonly=true)
public class SpitterServiceImpl implements SpitterService{
. . .
@Transactional(propagation=Propagation.REQUIRED,readonly=false)
public void addSpittle(Spettle spittle){
. . .
}
. . .
}