Spring事务
Posted brook-alisa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务相关的知识,希望对你有一定的参考价值。
1.数据库事务的4个基本特征,即ACID
Atomic(原子性):数据库包含的操作被看作是一个整体的业务单元,该业务单元内的操作要么全部成功,要么全部失败。
Consistency(一致性):事务在完成时,必须使所有的数据保持一致的状态。
Isolation(隔离性):多线程同时操作同一数据时,会产生数据丢失,通过设置隔离级别,尽可能压制数据丢失的发生。
Durability(持久性):事务结束后,所有的数据都会固化到一个地方,比如放在磁盘中,即使断电重启也可以再次提供给程序使用。
2.隔离性中的隔离级别:未提交读,读写提交,可重复读,串行化
未提交读(read uncommitted)是最低的隔离级别,允许一个事务读取另外一个事务未提交的数据,容易发生脏读。
读写提交(read committed)是指一个事务可以读取另一个事务已经提交的数据,不能读取未提交的数据,缺点不可重复读。
可重复读(read repeatable)克服了不可重复读的问题,当一个事务未提交时,另一个事务不允许读取该数据,会产生幻读。
*注*:可重复读针对数据库的单条数据记录,幻读针对的是多条记录。
串行化(Serializable)是数据库最高隔离级别,保证所有的SQL按照顺序执行,所以能够完全保证数据的一致性,但是并发性能很低。
隔离级别和可能发生的现象如下:
项目类别 | 脏读 | 不可重复度 | 幻读 |
未提交读 | Y | Y | Y |
读写提交 | N | Y | Y |
可重复读 | N | N | Y |
串行化 | N | N | N |
对于隔离级别,不同的数据库的支持也有所不同:
Oracle只能支持读写提交和串行化,默认读写提交。
MySQL支持以上四种,默认可重复读。
3.事务的传播行为
传播行为是方法之间调用事务采取的策略问题。
Spring事务机制中存在7种传播行为,通过枚举类Propagation定义。
REQUIRED:默认传播行为,如果当前存在事务,就沿用当前事务,否则新建一个事务运行子方法。
REQUIRES_NEW:无论当前事务是否存在,都会新建事务运行方法,并且新事务拥有新的锁和隔离级别等特性,与当前事务相互独立。
SUPPORTS:支持事务,如果当前存在事务就沿用此事务,否则以无事务状态运行。
NOT_SUPPORTED:不支持事务,当前存在事务时,将挂起事务运行方法。
MANDATORY:必须使用事务,如果当前没有事务,则会抛出异常,如果存在当前事务就沿用此事务。
NEVER:不支持事务,如果当前存在事务,则会抛出异常,否则以无事务状态运行。
NESTED:在当期方法调用子方法时,如果子方法发生异常,则只回滚子方法执行的SQL,不回滚当前方法的事务。
常用的三种传播行为:REQUIRED,REQUIRES_NEW,NESTED
以上是关于Spring事务的主要内容,如果未能解决你的问题,请参考以下文章