Spring的配置式事务可以把多个操作数据库的方法配置在一个事务中。
起了一个新事务,就是创建了一个新的数据库连接。
如果方法中全是查询操作 根本没必要使用事务。
只是多了传播行为,只是因为存在方法的调用。根据你的传播行为,是使用同一个会话,还是使用一个新的连接回话。
Spring的事务是什么?与数据库的事务是否一样?
本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,Spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭。
Spring事务对数据库事务的包装,原理就是拿一个数据连接,根据Spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.
Spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.
1、Mysql中的事务必须是InnoDB、Berkeley DB引擎,myisam不支持。
2、Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务。
3、Mysql默认是autocommit=1,也就是说默认是立即提交,如果想开启事务,先设置autocommit=0,然后用START TRANSACTION、 COMMIT、 ROLLBACK来使用具体的事务。
4、事务控制要成对出现,有开启,必有提交和回滚,如果不匹配导致事务计时器错误,偏离预期的控制效果;
5、事务一般配合try catch异常处理语句一起实现,try包裹的语句体内,如果有错误,应该主动抛出异常,在catch内进行回滚操作,而不能直接在异常处回滚;
事务与事务的传播行为。
1、@Transactional 所在的类必须交给Spring管理,否则注解无效。
2、单独一个事务方法:方法内的操作同时成功,同时失败。
3、多个事务方法之间,存在事务的传播行为。
在service层加入事务控制。
由于@Transactional在Spring中的默认的事务规则是遇到运行异常(RuntimeException)才会进行回滚。如果想针对特殊异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。比如:
@Transactional(rollbackFor= Exception.class)
PROPAGATION_SUPPORTS:
支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务。
如果当前没有逻辑事务,就以非事务方式执行。
NotSupported:
不支持事务,如果当前存在事务则暂停该事务。使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行。
一句话以非事务的方式,如果有事务,就把事务关闭。
比如excel导入数据,可以以非事务的方式运行。
Spring的声明式事务是基于代理模式的。代理模式简单来说就是将另一个类包裹在目标类外面,在调用目标类的方法之前,先经过目标类的方法进行一些处理,返回之前再进行一些处理。