数据库事务是一系列作为一个逻辑单元来执行的操作集合。

spring事务总共5个级别。分别是default、read_uncommit,read_commit,repeat_table,serializable五个级别。

default: 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别。

read_uncommit(读未提交)会造成脏读、幻读和不可重复读。( 隔离级别最低,并发性能高 )

read_commit(读已提交)会造成幻读和不可重复读(锁定正在读取的行)

repeat_table(可重复度)会造成幻读(锁定所读取的所有行)

serializable 保证所有的情况不会发生(锁表)

脏读、幻读和不可重复读分别是什么意思呢?

脏读:一个事务读取了另一个事务修改但未提交的数据。

不可重复读:在同一个事务内多次读取同一数据,另一个事务也访问了该数据并在多次读取的中间对该数据进行了修改,导致第一个事务先后读取的数据不一致。

幻读:如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。如果发生这样的操作,第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。

不可重复读一般发生在update和delete时,幻读发生在insert时。

数据库的隔离级别

read_uncommit

read_commit

repeat_table

serializable 

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

传播行为一共有7种,共分为2类。

传播行为分为两种:分为支持事物的传播和不支持事物的传播

支持事务:

PROPAGATION_REQUIRED:如果当前没有事务,新建一个事务。如果当前有事务,则加入该事务。

PROPAGATION_SUPPORTS:如果当前有事务,则加入该事务。如果当前没有事务,已非事务运行。

PROPAGATION_MANDATORY:如果当前有事务,则加入该事务。如果当前没有事务,抛出异常。

PROPAGATION_REQUIRES_NEW:无论有没有事务都创建新事务。

不支持事物

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED:(不支持事物)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

spring与数据库事务本质上是一样的,spring是将数据库的事务进行封装。如果数据库没有事务,spring的事务是无效的。事务简单的来说就是提交、回滚和关闭三个操作。spring对数据库事务的封装原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作。