mysql事务
1.事务的ACID原则:
原子性(A):执行事务时,要么都成功,要么都不成功,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(C):执行后,保持数据的一致性
隔离性(I):事务相互独立,互不影响
持久性(D):执行后事务永久的存储在数据库中(内存的数据持久到硬盘文件中)
https://blog.csdn.net/weixin_43817064/article/details/97791740
2.脏读,幻读,不可重读的区别:
转发:http://www.zsythink.net/archives/1233
脏读:事务A没有做任何数据变更,但由于事务B对数据进行了操作,但是还未提交,这时事务A查到了事务B还未提交的数据,这个就是脏读。(侧重点在于别的事务未提交)
幻读:事务A未做任何改变,但由于事务B对数据进行了操作,已经提交,这时事务A相比于第一次查询,莫名的多出了一些之前不存在数据,或者莫名的不见了一些数据
不可重读: 不可重读的侧重点在于更新修改数据。表示在同一事务中,查询相同的数据范围时,同一个数据资源莫名的改变了。
3.隔离级别:
a.读未提交:比如事务A添加了一笔数据但是未提交,事务B这时是可以读到事务A未提交的数据的,这时B(未提交)读到的就相当与脏数据
b.读提交:比如事务A添加了一笔数据但未提交,事务B是读取不到事务A这笔数据的,如果事务A提交了,事务B(未提交)就可以读到
c.可重读:比如事务A添加了一笔数据也commit提交了,但事务B的查询语句还未提交,在未提交前是读不到事务A添加的那笔数据的,事务B的查询sql提交后就可以读到事务A添加的那笔数据了
d.串行化:当事务A在执行写时,事务B这时进行查询了,那这时事务B只能等待,在A事务写完commit提交后,事务B查询的数据就可以查出来了
4.不同隔离级别所拥有的问题:
注:只有innodb引擎支持事务,mysql中默认的隔离级别是 REPEATABLE-READ可重复读(https://www.cnblogs.com/who-else/p/6659564.html)
spring事务:
https://www.cnblogs.com/zhaoyibing/p/9558960.html
https://blog.csdn.net/ken_guanjy/article/details/105722146 (注:这个对事务传播有形象的解析)
a.事务传播行为:
传播行为 | 意义 |
PROPAGATION_REQUIRES | 表示当前方法必须在一个事务中运行。如果一个现有事务正在进行中,该方法将在那个事务中运行,否则就要开始一个新事务。 |
PROPAGATION_SUPPORTS | 表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。 |
PROPAGATION_MANDATORY | 表示该方法必须运行在一个事务中。如果当前没有事务正在发生,将抛出一个异常。 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须在它自己的事务里运行。一个新的事务将被启动,而且如果有一个现有事务在运行的话,则将在这个方法运行期间被挂起。 |
PROPAGATION_NOT_SUPPORTED | 表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。 |
PROPAGATION_NEVER | 表示当前的方法不应该在一个事务中运行。如果一个事务正在进行,则会抛出一个异常。 |
PROPAGATION_NESTED | 表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。 |
b.隔离级别:
隔离级别 | 含义 |
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别。 |
ISOLATION_READ_UNCOMMITTED | 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。 |
ISOLATION_READ_COMMITTED | 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。 |
ISOLATION_REPEATABLE_READ |
对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。 |
ISOLATION_SERIALIZABLE |
完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。 |
c.只读
https://www.cnblogs.com/jtlgb/p/10435450.html
d.事务超时