spring事务
1、什么是事务?
事务就是被捆绑在一起作为一个逻辑工作单元的sql语句分组,如果任何一个语句操作失败那么整个操作就会失败,以后操作就会回滚到操作前状态,或者是上个节点。为了确保数据库的正确性,要么同时执行,要么同时不执行,就可以使用事务。
2、事务的特点(ACID):
原子性:事务是一个不可分割的单位,要么都发生,要么都不发生。
一致性:事务执行前后数据的完整性必须保持一致。
隔离性:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰。多个并发事务的数据相互隔离。
持久性:事务一旦被提交后,数据就会被持久化到数据库中。
3、(1)spring的事务是使用aop实现的,而aop是使用动态代理实现的。
(2)spring的事务是在业务逻辑层(service)管理的
在业务逻辑开始的时候加上事务,有异常回滚;没有异常提交,最后释放资源
4、(1)事务隔离级别的设置是为了解决脏读,不可重复读,幻读等问题的。
脏读:一个事务a读取了另一个事务b改写还未提交的数据,如果另一个事务b回滚,事务a读取到的数据是无效的。
不可重复读:在同一个事务中,多次读取同一数据读取到的结果不同。比如事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:一个事务读取了几行数据后,另一个事务插入了新的数据后,幻读就发生了。再后来的查询中,第一个事务就会发现一些原来没有的数据。
总结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
(2)解决读问题: 设置事务隔离级别(5种)
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,幻读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.
Mysql 默认:可重复读
Oracle 默认:读已提交
5、事务的传播行为(7种)
PROPAGION_XXX :事务的传播行为
+保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
+保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行