只读属性
对于单纯读取数据库操作, 可以设置readOnly=true, 可以提高数据的放效率.
如:
@Transactional(readOnly=true)
public List<Map<String, Object>> listNotesInTrashBin(
String userId) throws UserNotFoundException {
事务的传播
业务过程重构时候需要业务方法调用业务方法, 这样就需要一个业务方法的事务传播到另外一个业务方法中, 整合为一个事务.
事务传播(propagation)属性
- @Transactional(propagation=Propagation.REQUIRED)
- 需要事务, 如果没有事务创建新事务, 如果当前有事务参与当前事务
- @Transactional(propagation=Propagation.MANDATORY)
- 必须有事务, 如果当前没有事务就抛异常
- @Transactional(propagation=Propagation.NEVER)
- 绝不, 绝对不能有事务, 如果在事务中调用则抛出异常
- @Transactional(propagation=Propagation.NESTED)
- 嵌套, 必须被嵌套到其他事务中
- @Transactional(propagation=Propagation.NOT_SUPPORTED)
- 不支持事务
- @Transactional(propagation=Propagation.SUPPORTS)
- 支持事务, 如果没有事务也不会创建新事务
- @Transactional(propagation=Propagation.REQUIRES_NEW)
- 必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务.
事务隔离属性
一共有4种, 一般采用 @Transactional(isolation=Isolation.READ_COMMITTED) 级别, 是并发性能和安全性折中的选择. 是大多数软件项目采用的隔离级别.
声明式事务
就是所有业务方法使用@Transactional, 如果是只读方法, 建议增加readOnly=true