Spring 支持两种类型的事务管理:
编程式事务管理:
这意味你通过编程的方式管理事务,给你带来极大的灵活性, 但是难维护。
声明式事务管理:
这意味着你可以将业务代码和事务管理分离,你只需用注解和 XML 配置来管理事务。
Spring 事务的实现方式和实现原理
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持, spring 是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过 binlog 或者 redo log 实现的。
说一下 Spring 的事务传播行为
spring 事务的传播行为说的是,当多个事务同时存在的时候,spring 如何处理 这些事务的行为。
说一下 spring 的事务隔离?
spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设 置),其他四个隔离级别和数据库的隔离级别一致:
- ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什 么我就用什么;
- ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交 前,就可被其他事务读取(会出现幻读、脏读、不可重复读);
- ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其他事务读 取到(会造成幻读、不可重复读),SQL server 的默认级别;
- ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时, 其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据 (会造成幻读),MySQL 的默认级别;
- ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离 级别能防止脏读、不可重复读、幻读。
脏读 :
表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务 尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
不可重复读 :
是指在一个事务内,多次读同一数据。
幻读 :
指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一 次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好 像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一 个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录 就变多或者变少了。