事务隔离级别
设置了autocommit=on后
如果未手动开启事务,默认自动提交事务。
如果手动开启事务,如linux命令行下,begin开启一个事务,则需要rollback或者commit!
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | Y | Y | Y |
READ COMMITTED | N | Y | Y |
REPEATABLE READ | N | N | Y |
SERIALIZABLE | N | N | N |
READ UNCOMMITED
T1事务执行一条update操作后,当前事务中可以看到更新后的值,执行rollback和commit后结束事务。
T2事务在T1未commit或rollback,可以看到T1更新后的值(脏读),如果T1执行了rollback,查看到原值,commit后新值。
T1开启事务后,执行id=X的update操作,未进行commit和rollback,此时T2开启事务后,update同一个id的记录,会报错ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。
READ COMMITED
T1事务开启后,insert一条记录,T1事务中能看到当前插入记录。
T2事务开启后,如果T1插入未commit或rollback,T2不能读取到插入的记录,T1 commit后,T2能查询到新增的记录,在T2同一个事务中查询到的两次结果不同。
REPEATABLE READ
事务T1在upldate或者insert了一条记录,T1事务中能看到当前更新后记录。
事务T2开启事务后,事务T1无论提交与否,查看到的都是事务开始时的记录。如果T2事务结束后,另开启一个事务能看到更新后的记录。
SERIALIZABLE
T1事务执行了select操作,T2事务只能进行select操作,不能进行insert,update操作(共享锁原理)。
T1事务执行了insert或update操作,T2事务只能等待T1提交事务。
Spring事务的传播属性
所谓spring事务的传播属性,就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为。这些属性在TransactionDefinition中定义,具体常量的解释如下。
PROPAGATION_REQUIRED
支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内层事务的回滚不会对外部事务造成影响,外层事务失败会回滚内层事务所做的操作。它只对DataSourceTransactionManager事务管理器起效。
事务验证以下两篇博文有详细讲解,一看就懂!
原文:https://segmentfault.com/a/1190000013341344
https://blog.csdn.net/soonfly/article/details/70305683