事务定义
事务(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
它是一个接口,提供了事务具体的执行状态,描述了某一个时间点上事务对象的状态信息。