1.事务的基本特性
原子性:一个事务的基本操作,要么成功要么失败,不能存在中间状态。
一致性:无论事务状态怎么改变,整个系统数据是一致的,例如数据库中3个人的账户余额都是10000,3者之间无论如何转账,3者账户总额都是30000。
隔离性:保证事务之间的执行像串行化执行。
持久性:事务完成之后,保证持久的写入到数据库,不会再发生回滚操作。
2.隔离级别
当多个事务对同一数据进行读写时会产生数据不一致问题,所以就产生了事务之间的隔离问题。事务的隔离级别有4种。
读未提交:一个事务未提交的数据,另外一个事务也能够读取到。这样就存在一种可能,事务a读取到数据了,还未提交,事务b也读取到该数据了,然后事务a提交了数据,也就是改变了数据,然后事务b又提交了数据就造成了两个事务都对数据进行了修改,但只有事务b的修改生效了,事务a的修改被覆盖了。这样就产生了脏读问题。
读已提交:在读未提交级别中,两个事务之间会产生脏读问题。为了解决脏读问题,设置了读已提交隔离级别,当事务a读取了数据,然后做了修改,未提交之前,事务b也读取了数据,事务b对数据进行修改是不能进行提交的,因为事务a在事务b之前读取数据了,并且还未提交,当事务a提交后,事务b才可读取数据b,然后再提交数据,也就是在事务a读取数据并提交事务前后,别的事务都可以读取数据,这样的话就导致在事务a提交事务前后,别的事务读取的数据不一致,产生了不可重复读问题。
可重复读:读已提交级别中,存在不可重复读问题,在事务a读取数据后,别的事务就不能读取到数据了,当事务a提交事务了,别的事务才可读取数据,这样的话就可以达到可重复读取数据了,这样的话当别的事务修改数据,也会及时的获取到最新数据,但当存在事务进行新增数据时,那么别的事务在新增事务提交前后读取的数据就不会一致了,就出现幻读现象。
串行化:每个事务以顺序的方式进行读取及提交,事务之间不存在交错提交的情况。
隔离级别运行效率:读未提交 > 读已提交 > 可重复读 > 串行化
mysql数据库默认的隔离级别是读已提交。
3.事务的传播机制
当一个方法a声明了事务,调用了另外一个方法b,方法b也声明了事务,这个时候方法b是加入方法a的事务还是单独开辟一个新的事物?
这里就设计事务的传播机制,spring支持7种事务的传播机制,PROPAGATION_REQUIRED为默认的传播方式。
required:默认为必须的,如果没有事务则新建一个事务,如果已经存在事务,就加入该事务。
require_new:不存在事务就创建一个事务,存在事务会将该事务挂起,创建一个新事务。
supports:支持事务,存在事务就加入该事务,不存在事务就以非事务方式运行。
not_supported:已非事务方式运行,存在事务就将事务挂起。
mandatory:强制的,如果没有事务就抛出异常。
never: 总是以非事务方式运行,存在事务就抛出异常。
nested:当前没有事务就新建一个事务,如果有,就嵌套运行。外围事务回滚,内嵌事务一定回滚,内嵌事务回滚,外围事务可不回滚。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。