BackGround:
最近一直在面试,感觉spring的事务配置问的挺多的,再扯出来好好瞅瞅,争取做到秒杀面试官。![生气](http://img.e-com-net.com/image/info5/ff079f32a2844ec9b8936789076c10d4.gif)
![得意](http://img.e-com-net.com/image/info5/32757315c2cb4277b2d5fc84bc745a19.gif)
一,事务的基本概念
什么是事务?
逻辑上的一组操作,这组操作要么全都成功,要么全都失败。例如,我购买完一个课程,要进行支付,需要首先去我的账户表中减去需要支付的金额,然后更新订单状态,支付才算是成功,那么支付跟更新订单状态就要放在一个事务里面执行,要么全成功,要么全失败,不能出现那种我买了课程,结果订单还显示我未支付,尼玛,坑爹呀。(不过宝宝真遇到过这种情况。。。)
事务的特性
原子性:事务是一个 不可分割的单位,事务中的操作要么都发生,要么都不发生。
一致性:事务前后数据的完整性必须保持一致。
隔离性:多个用户并发访问数据库的时候,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
持久性:一个事务一旦被提交了,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。
二,spring中事务的API介绍
1,接口介绍
spring事务管理高层抽象主要有3个接口:
PlatformTransactionManager(事务管理器)
TransactionDefinition(事务定义信息【隔离,传播,超时,只读】)
TransactionStatus(事务具体运行状态)
2,PlatformTransactionManager
spring为不同的持久化框架选择不同的PlatformTransactionManager接口实现:
3,TransactionDefinition
在使用事务的时候,如果不考虑事务的隔离性,会引发一些安全性的问题:例如,脏读,不可重复读,幻读。
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚, 则读到的数据是无效的。
不可重复读:在同一个事务里面,多次读取同一数据返回的结果有所不同。
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。在后来的查询中,第一个事务就会发现有些原来没有的记录。
事务的隔离级别:
4,事务的传播行为
事务的传播行为解决了业务层方法的互相调用产生的事务如何传递的问题。