Spring中事务控制的一组API
事务控制
JavaEE 体系进行分层开发,事务控制和处理处于业务层
如果想要在业务层进行事务控制有两种方法:
1.可以通过自己编写事务控制类既编码方式实现
2.也可以通过Spring为我们提供的事务控制接口实现事务控制(通过配置文件或者注解的方式)
Spring中事务控制( Spring中事务控制的API)
Spring为我们提供了一组事务控制的接口,这组接口是在spring-tx.5.0.2.RELESE.jar中,Spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式实现。
PlateformTransactionManager接口
PlateformTransactionManager接口 :此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法
(类似于编程方式实现事务控制中的TransactionManager类(我自己写的,如果是别人写名字不一定是这个),如果是编程实现,那么就需要把这个类的对象的创建交给spring 容器,类似于通知类,但是这个PlateformTransationManager 是个接口 )
PlateformTransactionManager接口中的方法:
获取事务状态的信息:
TransactionStatus getTransation(TransactionDefinition definition)
提交事务:
void commit(TransactionStatus status):
回滚事务:
void rollblack(TransactionStatus status)
在Spring的实际开发中,我们都是使用它的实现类 DataSourceTrabsationManager
TransationDefinition :事务的定义信息对象
1.并发 事务处理带来的问题
并发事务处理可以大大的提高数据库系统资源的利用率,提高数据库系统事务的吞吐量,从而支持更多的用户,但是并发处理也会带来一些问题
主要包括一下情况:
脏读:一个事务读取到另一个事务尚未提交的数据
不可重复读:一个事务读取某些数据后的一段时间,再次读取以前读过的数据,却发现读过的数据发生了改变或者数据已经被删除
幻读:一个事务按照相同的检索条件重新读取以前 检索过的数据,却发现其他事务插入了满足其拆查询条件的新数据
2.事务的隔离级别
“脏读”、“不可重复读”、“幻读”其实都是数据库一致性的问题,为了解决这种情况,,需要数据库提供一定的事务隔离机制来解决,
数据库事务的4种隔离级别:
由低到高分别为
1.Read uncommitted (读未提交) :一个事务可以读取到另一个事务未提交的数据
2. Read committed (读提交):一个事务要等另一个事务提交后才能读数据
3.Repeatable read (重复读):开始读数据(开启事务)时,不允许修改数据
4.Serializable :Serializable 是最高的事务隔离级别,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
获取事务对象的名称:
String getName()
获取事务隔离级别:
int getIsolationLevel()
获取事务传播行为:
int getPropagtionBehavior()//什么时候可以有事务,什么时候可有可没有事务(如增删改必须有事务,查询可有可无)
获取事务超时时间:
int getTimeout()//当提交或者回滚事务多长时间就过期了 -1表示永远不过期
获取事务是否只读:
boolean isReadOnly()//查询的时候只读
3.事务的传播行为
REQUIRED:如果当前没有事务,就创建一个事务,如果已经 存在一个事务中,加入到这个事务。一般的选择(增删改的选择。默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式运行,(没有事务。查询的选择)
TransationStatus:此接口提供的是事务具体的运行状态
刷新事务:
void flush()
获取是否存在存储点:(事务按步提交,每个存储点就是事务的一步,当执行成功之后就是提交这一步,所有步骤都成功整个事务结束,如果在某一步没有成功,那回滚的时候只会滚到当前这一步,而不是回滚到所有存储点的最开始)
boolean hasSavepoint()
获取事务是否完成:
boolean isCompleted()
获取事务是否为新的事务:
boolean isNewTransation()
获取事务是否回滚:
boolean isRollbackOnly()
设置事务回滚:
void setRollbackOnly()