有两种事务控制的方法:编程式(硬编码,代码,API)vs 声明式(xml或注解)
声明式的好处:事务管理不侵入开发的组件,更改只需要在定义文件中出现配置即可。业务逻辑对象不会意识到处在事务管理之中,事实上也该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分。而且不需要事务管理时可关闭,符合开闭原则。(解耦)
Spring声明式事务控制底层就是aop。
- 编程式事务控制3大对象:
- (关系)PlatformTransactionManager( *** 作事务行为)+TransactionDefinition(设置事务属性)=TransactionStatus(反馈事务运行过程中的信息,被动产生,不需配置)
- (一)接口-PlatformTransactionManager(平台事务管理器)
- 不同的Dao层(持久层)技术则有不同的PlatformTransactionManager实现类,例如,Dao层技术是jdbc或mybatis时,PlatformTransactionManager的实现类是org.springframework.jdnc.DataSourceTransactionManager,Dao层技术是Hibernate时是org.springframework.orm.hibernate5.HibernateTransactionManager
TransactionStatus getTransaction(TransactionDefinition definition):获取事务的状态信息
void commit(TransactionStatus status):提交事务
void rollback(TransactionStatus status):回滚事务
- (二)TransactionDefinition(定义信息对象)
int getIsolationLevel():获得事务的隔离级别
- 事务的隔离级别:解决事务并发产生的问题,如脏读,不可重复读和虚读
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
- 这里复习一下数据库的知识:
int getPropogationBehaviour():获得事务的传播行为
int getTimeout():获得超时时间
boolean isReadOnly():是否只读
- 事务的传播行为:
REQUIRED(default):如果当前没有事务就新建一个;如果存在一个事务,就加入到这个事务中
SUPPORTS:支持当前事务,如果当前没有事务属性就以非事务方式执行(没有事务)
...还有一些属性
超时时间:设为-1时,没有超时限制;有就以秒为单位进行设置
是否只读:建议查询时设置为只读
- (三)接口-TransactionStatus(事务具体的运行状态)
boolean hasSavePoint():是否存储回滚点
boolean isCompleted():事务是否完成
boolean isNewTransaction():是否是新事务
boolean isRollbackOnly():事务是否回滚
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)