事务 E:\HNHJ\java13\ibatis_template\doc\iBatis 学习笔记\IBATIS学习笔记(3) SQL Map XML配置文件 - 有时候,桔色的灯光下,一杯清茶,我们能分享很多! - 博客园.mht
声明式事务。
编程式事务。
Spring注解方式
Log4j,commons-logging
<context:component-scan /> 注解方便之处。
注解配置生效:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 默认实现,可以不写,Spring容器默认会使用该类。
Org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 直接关系到多动作控制器配置是否可用!
序列化优点:对象需要进行网络传输,本地缓存,建议实现序列化接口。Serializable
Service注入
@Service
@Transactional
Public class AccountServiceImpl …{
@Autowired
Private AccountDao accountDao;
}
Dao注入
@Repository
Public class AccountDaoImpl …{
}
Spring声明式事务
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
template.execute(new TransactionCallbackWithoutResult(){
protected void doInTransactionWithoutResult(TransactionStatus status){
testDao.save(obj);
}
});
//获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager)ctx.getBean("
txManager");
//定义事务管理的模板
TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
//定义事务属性
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(){
//执行数据库操作
System.out.println(jdbcTemplate.queryForInt("select count(*) from tbl_doc"));
return null;
}
});
之前项目中应用的事务框架写法:
1.transactionManager,
2.transactionAttributes (modify* ,PROPAGATION_REQUIRED, readOnly),
3.service bean关联,
<bean id="userService" parent="txProyTemplate">
<property name="target">
<bean class="xx.xx.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</property>
</bean>
事务测试情形一
Web层捕获异常并处理,DAO层不捕获异常,Service也不捕获异常。 èspring事务管理成功(封装DataAccessException异常逐层抛出)
事务测试情形二
Web捕获异常并处理,Service捕获异常并处理,DAO层不捕获异常。èService捕获异常并不向外抛出,web层捕获不到异常,Spring事务管理失败。
事务测试情形三
Web层捕获异常,Service捕获异常,DAO层也捕获异常。 èDAO层捕获异常,其他捕获不到,Spring事务管理失败。
事务基础
ACID特征
隔离级别
ISOLATION_DEFAULT: 默认隔离级别,即使用底层数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED: 未提交读(未授权读取)
ISOLATION_READ_COMMITTED: 提交读,一般情况下我们使用这个(授权读取)
ISOLATION_REPEATABLE_READ: 可重复读
ISOLATION_SERIALIZABLE: 序列化
传播行为(7种)
1.Required:必须有逻辑事务。表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务。PROPAGATION_REQUIRED指定。
因此userService对象的save方法和addressService的save方法属于同一个物理事务,如果发生回滚,则两者都回滚。
2.RequiresNew:创建新的逻辑事务。PROPAGATION_REQUIRES_NEW指定。
userService对象的save方法和addressService对象的save方法不属于同一个逻辑事务也不属于同一个物理事务。
3.Supports,支持当前事务,使用PROPAGATION_SUPPORTS指定。如果当前存在逻辑事务,就加入到该逻辑事务,否则以非事务方式执行。
4.NotSupported:不支持事务。使用PROPAGATION_NOT_SUPPORTED指定。
5.Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出iIllegalTransactionStateException
6.Never:不支持事务,如果当前存在事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常illegalTransactionStateException
7.Nested:嵌套事务支持。使用PROPAGATION_NESTED指定。如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。
事务超时, setTimeout(100)
事务只读,将事务标示为只读,只读事务不修改任何数据。
汇总:
除了REQUIRED事务,spring中还有以下事务
PROPAGATION_MANDATORY: 方法必须在一个现存的事务中进行,否则丢出异常
PROPAGATION_NESTED: 在一个嵌入的事务中进行
PROPAGATION_NEVER: 不应在事务中进行,如果有则丢异常
PROPAGATION_NOT_SUPPORTED: 不应再事务中进行,如果有就暂停现存的事务
PROPAGATION_REQUIRED: 支持现在的事务,如果没有就建立一个新的事务
PROPAGATION_REQUIRES_NEW: 建立一个新的事务,如果现存一个事务就暂停它
PROPAGATION_SUPPORTS: 支持现在的事务,如果没有就以非事务的方式执行
--http://dannyfk221.iteye.com/blog/1692271—
MySQL相关
要使用MySQL数据库进行事务处理,必须建立支持事务的表格类型,例如InnoDB的表格类型。
Create table user(
Id int(11) not null auto_increment primary key,
Name varchar(100) not null default ' ';
Age int
)type = InnoDB;