网站根目录 本地共享,正规网站制作公司哪家好,深圳网站建设平台,卖手表的网站事务首先#xff0c;我们要知道事务是什么构成单一逻辑工作单元的操作集合称为事务事务的ACID特性原子性#xff1a;不可分割的最小操作单位#xff0c;要么同时成功#xff0c;要么同时失败一致性#xff1a;事务操作前后#xff0c;数据总量不变隔离性#xff1a;多个…事务首先我们要知道事务是什么构成单一逻辑工作单元的操作集合称为事务事务的ACID特性原子性不可分割的最小操作单位要么同时成功要么同时失败一致性事务操作前后数据总量不变隔离性多个事务之间相互独立持久性当事务提交或回滚后数据会持久化的保存数据传统编程的事务管理在传统的JAVA数据库编程中我们遵循的是打开连接-执行操作-提交事务-关闭连接如下面的代码Connection con getCon();con.setAutoCommit(false);con.prepareStatement(UPDATE...).execute();con.prepareStatement(UPDATE...).execute();con.commit();//conn.rollback();con.close();这样就产生了很多模板代码而且依靠程序员手动提交事务也十分不可靠Spring对事务的管理Spring的事务管理分为两类声明式事务编程式事务Spring定义了一个接口PlatformTransactionManager 我们只需要使用其实现类将数据源交其管理即可实现Spring事务管理ConfigurationEnableTransactionManagement // 开启事务管理ComponentScan(wang.ismy.spring)public class Config { Bean public DataSource dataSource(){ DruidDataSource druidDataSource new DruidDataSource(); druidDataSource.setUrl(jdbc:mysql:///test); druidDataSource.setUsername(root); druidDataSource.setPassword(123); return druidDataSource; } Bean public JdbcTemplate jdbcTemplate(DataSource dataSource){ return new JdbcTemplate(dataSource); } Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); }}这样当你在你的service中抛出异常的时候Spring就会自动帮你进行事务回滚 Transactional(rollbackFor Exception.class) // Spring默认只对运行期异常回滚加上该属性则设置回滚的异常类型为Exception public void transfer() { jdbcTemplate.execute(UPDATE account SET amount 90 WHERE name alice); int a1/0; jdbcTemplate.execute(UPDATE account SET amount 110 WHERE name bob); }属性Transactional注解的一些属性说明如下read-only是否是只读事务。默认false不只读。isolation指定事务的隔离级别。默认值是使用数据库的默认隔离级别。propagation指定事务的传播行为。timeout指定超时时间。默认值为-1。永不超时。rollback-for用于指定一个异常当执行产生该异常时事务回滚。产生其他异常事务不回滚。没有默认值任何异常都回滚。no-rollback-for用于指定一个异常当产生该异常时事务不回滚产生其他异常时事务回滚。没有默认值任何异常都回滚。理解事务的传播行为PROPAGATION_REQUIRED简单来说就是两个被事务管理的方法都将在同一个事务内执行PROPAGATION_REQUIRES_NEW而这个传播行为则是开启一个新事务PROPAGATION_NESTED该传播行为则是与JDBC的保存点一样它使用了物理事务的保存点的概念编程式事务一般来说编程式事务很少用它就是把一些对数据库的更新操作放在一起来达到事务管理的目的首先我们需要一个 Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ return new TransactionTemplate(manager); }在使用的时候注入这个Template进行操作 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; }); }这样也能进行事务管理原理最后来探讨一下Spring事务管理的原理一句话事务管理是通过AOP实现的这个我们通过获取Bean的实际类型就知道System.out.println(context.getBean(AccountService.class).getClass());// 结果class wang.ismy.spring.AccountService$$EnhancerBySpringCGLIB$$f8bd6705这是Spring官网给出的一个受事务管理的概念视图AOP增强了我们的Service类当真实的方法被调用前与调用后Spring替我们完成commit/rollback等操作以实现事务管理