diff --git "a/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/AOP.md" "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/AOP.md" index b4b322113a..214dd5431b 100644 --- "a/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/AOP.md" +++ "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/AOP.md" @@ -119,169 +119,5 @@ public class ErrorPageAspect { ``` -# 事务 -## 属性 - -- read-only:是否是只读事务。默认false,不只读。 -- isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。 -- propagation:指定事务的传播行为。 -- timeout:指定超时时间。默认值为:-1。永不超时。 -- rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。 -- no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,任何异常都回滚。 - -## 使用xml进行配置 - -- 声明式事务 - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -```java -public class Dao { - - private JdbcTemplate jdbcTemplate; - - public Dao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public void transfer(){ - String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; - String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; - jdbcTemplate.update(sql); - jdbcTemplate.update(sql1); - } -} -``` - -## 注解配置 - -```java -@Configuration -@EnableTransactionManagement -public class Config { - - @Bean - public DataSource dataSource(){ - DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setUsername("root"); - dataSource.setPassword("123"); - dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); - dataSource.setUrl("jdbc:mysql:///mybatis"); - return dataSource; - } - - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource){ - return new JdbcTemplate(dataSource); - } - - @Bean - public PlatformTransactionManager transactionManager(DataSource dataSource){ - return new DataSourceTransactionManager(dataSource); - } -} -``` - -```java -@Service -public class Dao { - - private JdbcTemplate jdbcTemplate; - - public Dao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - @Transactional(rollbackFor = Exception.class) - public void transfer(){ - String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; - String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; - - jdbcTemplate.update(sql); - jdbcTemplate.update(sql1); - } -} -``` - -- 编程式事务 - -```java - @Bean - public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ - return new TransactionTemplate(manager); - } -``` - -```java -@Service -public class Dao { - - private JdbcTemplate jdbcTemplate; - - private TransactionTemplate transactionTemplate; - - public Dao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public void transfer(){ - transactionTemplate.execute((TransactionCallback) status -> { - String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; - String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; - jdbcTemplate.update(sql); - jdbcTemplate.update(sql1); - return null; - }); - } - - @Autowired - public void setTransactionTemplate(TransactionTemplate transactionTemplate) { - this.transactionTemplate = transactionTemplate; - } -} -``` diff --git "a/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/nav.md" "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/nav.md" index 41c8cc00c8..a8a0d521e0 100644 --- "a/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/nav.md" +++ "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/nav.md" @@ -4,6 +4,7 @@ - [装配Bean](./装配Bean.md) - [高级装配](./高级装配.md) - [AOP](./AOP.md) + - [事务](./事务.md) - ## SpringMVC diff --git "a/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/\344\272\213\345\212\241.md" "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/\344\272\213\345\212\241.md" new file mode 100644 index 0000000000..af1cae794c --- /dev/null +++ "b/\345\220\216\347\253\257\345\274\200\345\217\221/\346\241\206\346\236\266/Spring/\344\272\213\345\212\241.md" @@ -0,0 +1,184 @@ +# 事务 + +## 属性 + +- read-only:是否是只读事务。默认false,不只读。 +- isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。 +- propagation:指定事务的传播行为。 +- timeout:指定超时时间。默认值为:-1。永不超时。 +- rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。 +- no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,任何异常都回滚。 + +### 传播行为 + +- PROPAGATION_REQUIRED + +![](https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/images/tx_prop_required.png) + +简单来说就是两个被事务管理的方法都将在同一个事务内执行 + +- PROPAGATION_REQUIRES_NEW + +![](https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/images/tx_prop_requires_new.png) + +而这个传播行为则是开启一个新事务 + +- PROPAGATION_NESTED + +该传播行为则是与JDBC的保存点一样,它使用了物理事务的保存点的概念 + +## 使用xml进行配置 + +- 声明式事务 + - 声明式事务都是基于编程事务 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +```java +public class Dao { + + private JdbcTemplate jdbcTemplate; + + public Dao(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void transfer(){ + String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; + String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; + jdbcTemplate.update(sql); + jdbcTemplate.update(sql1); + } +} +``` + +## 注解配置 + +```java +@Configuration +@EnableTransactionManagement +public class Config { + + @Bean + public DataSource dataSource(){ + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setUsername("root"); + dataSource.setPassword("123"); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql:///mybatis"); + return dataSource; + } + + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource){ + return new JdbcTemplate(dataSource); + } + + @Bean + public PlatformTransactionManager transactionManager(DataSource dataSource){ + return new DataSourceTransactionManager(dataSource); + } +} +``` + +```java +@Service +public class Dao { + + private JdbcTemplate jdbcTemplate; + + public Dao(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Transactional(rollbackFor = Exception.class) + public void transfer(){ + String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; + String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; + + jdbcTemplate.update(sql); + jdbcTemplate.update(sql1); + } +} +``` + +- 编程式事务 + +```java +@Bean +public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ + return new TransactionTemplate(manager); +} +``` + +```java +@Service +public class Dao { + + private JdbcTemplate jdbcTemplate; + + private TransactionTemplate transactionTemplate; + + public Dao(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void transfer(){ + transactionTemplate.execute((TransactionCallback) status -> { + String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; + String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; + jdbcTemplate.update(sql); + jdbcTemplate.update(sql1); + return null; + }); + } + + @Autowired + public void setTransactionTemplate(TransactionTemplate transactionTemplate) { + this.transactionTemplate = transactionTemplate; + } +} +``` \ No newline at end of file