spring之事务总结

事务定义

事务(transaction),一般是指要做的或者所做的事情。在程序中,尤其是在操作数据库的程序中,指的是访问并且可能更新数据库中数据项的一个执行单元(unit),这个执行单元由事务开始(begin transaction)和事务结束(end transaction)之间执行的全部操作组成。

事务特性(ACID原则)【记住】

事务具有4个基本特性:原子性、一致性、隔离性、持久性。也就是我们常说的ACID原则。

原子性(Atomicity):一个事务已经是一个不可再分割的工作单位。事务中的全部操作要么都做;要么都不做。

一致性(Consistency):事务必须是使得数据库状态从一个一致性状态,转变到另外一个一致性状态。也就是说在事务前,和事务后,被操作的目标资源状态一致。比如银行转账案例中,转账前和转账后,总账不变。

隔离性(Isolation):一个事务的执行不能被其他事务的影响。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,多个并发事务之间不能相互干扰。

持久性(Durability):一个事务一旦提交,它对数据库中数据的改变会永久存储起来。其他操作不会对它产生影响。

spring事务控制中需要明确的事项

第一件事

j2EE体系中项目按照分层进行设计开发,有表现层、业务层、持久层。事务处理位于业务层。spring提供了分层设计业务层的事务处理解决方案。

 

 

第二件事

spring框架为我们提供了一组事务控制接口,该组接口位于spring-tx-xxx.RELEASE.jar包中

第三件事

spring的事务都是基于AOP的实现,它既可以使用编程的方式实现,也可以使用配置的方式实现。我们这里重点是使用配置的方式来实现。

 

spring事务控制器的API介绍

1.PlatformTransactionManager

2.TransactionDefinition

 

事务隔离级别 【理解】

说明:事务隔离级别,反应了事务在并发访问时的处理态度。

 

ISOLATION_DEFAULT:

默认级别,归属于下列某一种隔离级别。在项目中使用默认值即可。

 

ISOLATION_READ_UNCOMMITTED:

可以读取其他事务未提交的数据(脏读)

 

ISOLATION_READ_COMMITTED:

只读取其他事务已经提交的数据,解决脏读的问题。有可能两次读取不一致的问题,不可重复读(oracle数据库默认级别)

 

ISOLATION_REPEATABLE_READ:

是否读取其他事务提交修改后的数据,解决不可重复读的问题。保证两次读取一致,可重复读(mysql数据库默认级别)

 

ISOLATION_SERIALIZABLE:

是否读取其他事务添加后的数据,解决幻影读的问题

 

细节:

1.事务级别从低到高:脏读->不可重复读->可重复读->解决幻读

2.事务级别越高,数据越安全,消耗的资源越多,数据库操作性能越低

3.在企业项目中,使用哪一种级别的事务,需要根据业务需求来确定

事务传播行为【理解】

说明:事务传播行为,决定在不同的执行环境中,事务该如何传递。

 

REQUIRED:

如果已经有事务,就加入该事务中执行;如果没有事务,则新建一个事务。对应增/删/改操作(默认值)

 

SUPPORTS:

如果已经有事务,支持当前事务的执行;如果没有事务,就以非事务的方式执行。对应查询操作

 

MANDATORY:

要求在事务环境下执行,如果当前没有事务,则抛出异常

 

REQUIRES_NEW:

新建事务,如果当前已经存在事务,则把当前事务挂起

 

NOT_SUPPORTED:

以非事务方式执行,如果当前有事务,则把当前事务挂起

 

NEVER:

以非事务方式执行,如果当前有事务,则抛出异常

 

NESTED:

如果当前已经有事务,嵌套在当前事务中执行;如果当前没有事务,则类似于REQUIRED操作

 

事务的传播行为

public class transactionPropragation{

public void m1(){// 该方法没有事务

}

public void m2(){// 该方法有事务

// m2中调用m1()
m1();// 请求m1有没有事务???

}

public void m3(){// 没有事务

// m3调用m1
m1();

}


}

4.5.TransactionStatus

存储点:

存储过程结构:
create or replace procuder pro

is

begin
save1:
// 记录用户操作日志

save2:
// 操作商品表

save3:
// 操作订单表

save4:
// 操作支付表

end;

事务超时时间

以秒为单位进行设置。如果设置为-1(默认值),表示没有超时限制。在企业项目中使用默认值即可。

 

 是否只读事务

只读事务比读写事务性能要高,实际项目中,查询一般建议设置为只读。

TransactionStatus

它是一个接口,提供了事务具体的执行状态,描述了某一个时间点上事务对象的状态信息。

 

posted @ 2020-06-12 09:51  JAVA_宇  阅读(189)  评论(0编辑  收藏  举报