事务概述
1)在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,
所以事务管理是企业级应用程序开发中必不可少的技术。
2)事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。
3)事务的四个关键属性(ACID)
①原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。
事务的原子性要求事务中的所有操作要么都执行,要么都不执行。
②一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。
一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。
如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
③隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,
因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。
④持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。
通常情况下,事务对数据的修改应该被写入到持久化存储器中。
配置事务
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/> dataSource是数据库连接池
</bean>
<!-- 启用事务注解 对事务相关的注解进行扫描,解析含义并执行功能-->//默认值为transactionManager 若id也为这个可不写
<tx:annotation-driven transaction-manager="transactionManager"/>
导入aspectj jar包,注解式事务管理依赖的jar包
@Transactional
事务注解,可以加到方法上也可加到类上
A方法和B方法都有事务,当A在调用B时,会将A中的事务传播给B方法,B方法对于事务的处理方式就是事务的传播行为
事务注解的属性:
@Transactional(propagation=Propagation.REQUIRED)
必须使用调用者的事务,REQUIRED
为默认值
Propagation.REQUIRES_NEW
:将调用者的事务挂起,不使用调用者的事务,使用新的事务进行处理 也就是说使用B的事务
isolation
:事务的隔离级别,一般用在并发的情况下,操作数据的一种规定
读未提交:可以读到未提交的数据,就可读到回滚的数据产生——脏读 针对于字段 1
读已提交:只能读到已经提交的数据,不可重复读 针对于字段 2
可重复读:会造成幻读 针对行 4 mysql中默认隔离级别,用的最多
串行化:是单线程 性能低,消耗大 8 访问量不大对数据要求严格的情况使用
timeout
:在事务强制回滚前最多可以执行(等待)的时间 mysql设置执行的时间,超过这个时间强制回滚
timeout=3 3秒
readOnly
:指定当前事务中的一系列的操作是否为只读
若设置为只读,不管事务中有没有写的操作,mysql都会在请求访问数据的时候,不加锁,提高性能,mysql是多线程和锁的机制
但是如果有写操作的情况,还设置为true,则会出现脏读 不可重复读 幻读全部出现,
因为没有锁了,我在操作这条数据的时候其他人也能操作,不能保证数据的一致性与完整性
建议一定不能设置只读
rollbackFor|rollbackForClassName|noRollbackFor|noRollbackForClassName
:设置事务回滚的条件