当前位置: 首页 > news >正文

中国网站建设银行-个人客户用.net做视频网站的案例

中国网站建设银行-个人客户,用.net做视频网站的案例,wordpress菜单教程,个人信息网站模板目录 一、JdbcTemplate#xff08;持久化技术#xff09; 1. 简介 2. 准备工作 2.1. 引入依赖坐标 2.2. 创建jdbc.properties 2.3. 配置Spring的配置文件 3. 测试 3.1. 在测试类装配 JdbcTemplate 3.2. 测试增删改功能 查询一条数据为实体类对象 查询多条数据为一个…目录 一、JdbcTemplate持久化技术 1. 简介 2. 准备工作 2.1. 引入依赖坐标 2.2. 创建jdbc.properties 2.3. 配置Spring的配置文件 3. 测试 3.1. 在测试类装配 JdbcTemplate 3.2. 测试增删改功能 查询一条数据为实体类对象 查询多条数据为一个list集合 查询单行单列的值 二、SpringTransactional事务管理 1. 事务类型 1.1. 编程式事务 缺陷 1.2. 声明式事务 好处 1.3. 总结 2. 基于注解的声明式事务 2.1. 准备工作 加入依赖 创建jdbc.properties 配置Spring的配置文件 创建表 创建组件 2.2. 测试无事务情况 创建测试类 模拟场景 观察结果 2.3. 加入事务 添加事务配置 添加事务注解 观察结果 2.4. Transactional注解标识的位置 2.5. 事务属性 1、只读readOnly 介绍 使用方式 注意 2、超时timeout 介绍 使用方式 观察结果 3、回滚策略四种 介绍 使用方式 观察结果 4、事务隔离级别Isolation 介绍 四种隔离级别 使用方式 5、事务传播行为propagation 介绍 测试 观察结果 6、总结 3. 基于XML的Transactional 3.1. 场景模拟 3.2. 修改 Spring 配置文件 一、JdbcTemplate持久化技术 1. 简介 Spring 框架对 JDBC 进行了封装使用 JdbcTemplate 可以让我们非常方便的实现对数据库的操作。 2. 准备工作 在使用JdbcTemplate之前我们需要进行一些依赖配置加入mysql-connector-java数据库连接驱动 配置druid连接池技术引入spring-orm包在执行持久化层操作与持久化层技术进行整合过程中 需要使用orm、jdbc、tx三个jar包导入·orm 包就可以通过 Maven 的依赖传递性把其他两个也jar包一起导入 2.1. 引入依赖坐标 !-- Spring 持久化层支持jar包 --!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中需要使用orm、jdbc、tx三个jar包 --!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --dependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion5.3.1/version/dependency 整体 dependencies!-- 基于Maven依赖传递性导入spring-context依赖即可导入当前所需所有jar包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.1/version/dependency!-- Spring 持久化层支持jar包 --!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中需要使用orm、jdbc、tx三个jar包 --!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --dependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion5.3.1/version/dependency!-- Spring 测试相关 --dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.3.1/version/dependency!-- junit测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.16/version/dependency!-- 数据源 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.31/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.3.1/version/dependency/dependencies 2.2. 创建jdbc.properties 有数据源环境必定需要配置数据源文件 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssm?serverTimezoneUTC jdbc.usernameroot jdbc.passwordroot 2.3. 配置Spring的配置文件 再通过配置Spring的配置文件引入数据源 !--引入jdbc.properties--context:property-placeholder locationclasspath:jdbc.properties/context:property-placeholderbean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/propertyproperty nameurl value${jdbc.url}/propertyproperty nameusername value${jdbc.username}/propertyproperty namepassword value${jdbc.password}/property/beanbean classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource/property/bean 3. 测试 3.1. 在测试类装配 JdbcTemplate 环境搭建完毕开始测试环境是否搭建成功 RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classpath:spring-jdbc.xml) public class JdbcTemplateTest {Autowiredprivate JdbcTemplate jdbcTemplate;} 3.2. 测试增删改功能 环境搭建成功后开始测试 JdbcTemplate 的增删改功能 Test //测试增删改功能 public void testUpdate(){ String sql insert into t_emp values(null,?,?,?); int result jdbcTemplate.update(sql, 张三, 23, 男); System.out.println(result); } 增删改测试完毕开始测试 JdbcTemplate 的查询功能 查询功能主要有查询一条数据为实体类对象查询多条数据为一个list集合查询单行单列的值 查询一条数据为实体类对象 Test //查询一条数据为一个实体类对象 public void testSelectEmpById(){ String sql select * from t_emp where id ?; Emp emp jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Emp.class), 1); System.out.println(emp); } 查询多条数据为一个list集合 Test //查询多条数据为一个list集合 public void testSelectList(){ String sql select * from t_emp; ListEmp list jdbcTemplate.query(sql, new BeanPropertyRowMapper(Emp.class)); list.forEach(emp - System.out.println(emp)); }查询单行单列的值 1、测试操作 Test //查询单行单列的值 public void selectCount(){ String sql select count(id) from t_emp; Integer count jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(count); } 2、创建jdbc.properties jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssm?serverTimezoneUTC jdbc.usernameroot jdbc.passwordroot 3、配置Spring的配置文件 !--引入jdbc.properties--context:property-placeholder locationclasspath:jdbc.properties/context:property-placeholderbean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/propertyproperty nameurl value${jdbc.url}/propertyproperty nameusername value${jdbc.username}/propertyproperty namepassword value${jdbc.password}/property/beanbean classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource/property/bean 4、测试 1、在测试类装配 JdbcTemplate RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classpath:spring-jdbc.xml) public class JdbcTemplateTest {Autowiredprivate JdbcTemplate jdbcTemplate;} 2、测试增删改功能 Test //测试增删改功能 public void testUpdate(){ String sql insert into t_emp values(null,?,?,?); int result jdbcTemplate.update(sql, 张三, 23, 男); System.out.println(result); } 3、查询一条数据为实体类对象 Test //查询一条数据为一个实体类对象 public void testSelectEmpById(){ String sql select * from t_emp where id ?; Emp emp jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Emp.class), 1); System.out.println(emp); } 4、查询多条数据为一个 list 集合 Test //查询多条数据为一个list集合 public void testSelectList(){ String sql select * from t_emp; ListEmp list jdbcTemplate.query(sql, new BeanPropertyRowMapper(Emp.class)); list.forEach(emp - System.out.println(emp)); } 5、查询单行单列的值 Test //查询单行单列的值 public void selectCount(){ String sql select count(id) from t_emp; Integer count jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(count); } 二、SpringTransactional事务管理 1. 事务类型 1.1. 编程式事务 事务功能的相关操作全部通过自己编写代码来实现 Connection conn ...; try { // 开启事务关闭事务的自动提交 conn.setAutoCommit(false); // 核心操作 // 提交事务 conn.commit(); }catch(Exception e){ // 回滚事务 conn.rollBack(); }finally { // 释放数据库连接 conn.close(); } 缺陷 细节没有被屏蔽具体操作过程中所有细节都需要程序员自己来完成比较繁琐代码复用性不高 如果没有有效抽取出来每次实现功能都需要自己编写代码代码就没有得到复用。 1.2. 声明式事务 既然事务控制的代码有规律可循代码的结构基本是确定的所以框架就可以将固定模式的代码抽取出来进行 相关的封装封装起来后我们只需要在配置文件中进行简单的配置即可完成操作 好处 好处1提高开发效率好处2消除了冗余的代码好处3框架会综合考虑相关领域中在实际开发环境下有可能遇到的各种问题进行了健壮性、性能等各个方 面的优化 1.3. 总结 所以我们可以总结下面两个概念 编程式自己写代码实现功能声明式通过配置让框架实现功能 2. 基于注解的声明式事务 2.1. 准备工作 加入依赖 dependencies!-- 基于Maven依赖传递性导入spring-context依赖即可导入当前所需所有jar包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.1/version/dependency!-- Spring 持久化层支持jar包 --!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中需要使用orm、jdbc、tx三个jar包 --!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --dependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion5.3.1/version/dependency!-- Spring 测试相关 --dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.3.1/version/dependency!-- junit测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.16/version/dependency!-- 数据源 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.31/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.3.1/version/dependency/dependencies 创建jdbc.properties jdbc.properties jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssm?serverTimezoneUTC jdbc.usernameroot jdbc.passwordroot 配置Spring的配置文件 !--扫描组件-- context:component-scan base-packagecom.zheng.travel.spring.tx.annotation/context:component-scan!-- 导入外部属性文件 -- context:property-placeholder locationclasspath:jdbc.properties / !-- 配置数据源 -- bean iddruidDataSource classcom.alibaba.druid.pool.DruidDataSource property nameurl value${jdbc.url}/ property namedriverClassName value${jdbc.driver}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean!-- 配置 JdbcTemplate -- bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplate !-- 装配数据源 -- property namedataSource refdruidDataSource/ /bean创建表 CREATE TABLE t_book ( book_id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键, book_name varchar(20) DEFAULT NULL COMMENT 图书名称, price int(11) DEFAULT NULL COMMENT 价格, stock int(10) unsigned DEFAULT NULL COMMENT 库存无符号, PRIMARY KEY (book_id) ) ENGINEInnoDB AUTO_INCREMENT3 DEFAULT CHARSETutf8;insert into t_book(book_id,book_name,price,stock) values (1,斗破苍穹,80,100),(2,斗罗大陆,50,100);CREATE TABLE t_user ( user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键, username varchar(20) DEFAULT NULL COMMENT 用户名, balance int(10) unsigned DEFAULT NULL COMMENT 余额无符号, PRIMARY KEY (user_id) ) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8; insert into t_user(user_id,username,balance) values (1,admin,50); 创建组件 1、创建BookController Controller public class BookController { Autowired private BookService bookService; public void buyBook(Integer bookId, Integer userId){ bookService.buyBook(bookId, userId); }} 2、创建接口BookService public interface BookService { void buyBook(Integer bookId, Integer userId); } 3、创建实现类BookServiceImpl Service public class BookServiceImpl implements BookService { Autowired private BookDao bookDao; Override public void buyBook(Integer bookId, Integer userId) { //查询图书的价格 Integer price bookDao.getPriceByBookId(bookId); //更新图书的库存 bookDao.updateStock(bookId); //更新用户的余额 bookDao.updateBalance(userId, price); }} 4、创建接口BookDao public interface BookDao { Integer getPriceByBookId(Integer bookId); void updateStock(Integer bookId); void updateBalance(Integer userId, Integer price); } 5、创建实现类BookDaoImpl Repository public class BookDaoImpl implements BookDao { Autowired private JdbcTemplate jdbcTemplate; Override public Integer getPriceByBookId(Integer bookId) { String sql select price from t_book where book_id ?; return jdbcTemplate.queryForObject(sql, Integer.class, bookId); } Override public void updateStock(Integer bookId) { String sql update t_book set stock stock - 1 where book_id ?; jdbcTemplate.update(sql, bookId); } Override public void updateBalance(Integer userId, Integer price) { String sql update t_user set balance balance - ? where user_id ?; jdbcTemplate.update(sql, price, userId); }} 2.2. 测试无事务情况 创建测试类 RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classpath:tx-annotation.xml) public class TxByAnnotationTest { Autowired private BookController bookController; Test public void testBuyBook(){ bookController.buyBook(1, 1); }} 模拟场景 用户购买图书先查询图书的价格再更新图书的库存和用户的余额 假设用户id为1的用户购买id为1的图书用户余额为50而图书价格为80 购买图书之后用户的余额为-30数据库中余额字段设置了无符号因此无法将-30插入到余额字段 此时执行sql语句会抛出SQLException 观察结果 因为没有添加事务图书的库存更新了但是用户的余额没有更新 显然这样的结果是错误的购买图书是一个完整的功能更新库存和更新余额要么都成功要么都失败 2.3. 加入事务 添加事务配置 在Spring的配置文件中添加配置 bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager    property namedataSource refdataSource/property /bean!--    开启事务的注解驱动    通过注解Transactional所标识的方法或标识的类中所有的方法都会被事务管理器管理事务--!-- transaction-manager属性的默认值是transactionManager如果事务管理器bean的id正好就是这个默认值则可以省略这个属性 --tx:annotation-driven transaction-managertransactionManager / 注意导入的名称空间需要 tx 结尾的那个 添加事务注解 因为service层表示业务逻辑层一个方法表示一个完成的功能因此处理事务一般在service层处理 在BookServiceImpl的buybook()添加注解Transactional 观察结果 由于使用了Spring的声明式事务更新库存和更新余额都没有执行 现在环境搭建完毕增删改查了解完毕就需要正式开始了解事务操做方案 首先我们要明确编程式事务和声明式事务两种概念 2.4. Transactional注解标识的位置 Transactional标识在方法上则只会影响该方法 Transactional标识的类上则会影响类中所有的方法 2.5. 事务属性 例如方法可能继续在现有事务中运行也可能开启一个新事务并在自己的事务中运行 REQUIRED如果当前没有事务就新建一个事务如果已经存在一个事务中加入到这个事务中一般的选择默认值SUPPORTS支持当前事务如果当前没有事务就以非事务方式执行没有事务MANDATORY使用当前的事务如果当前没有事务就抛出异常REQUERS_NEW新建事务如果当前在事务中把当前事务挂起NOT_SUPPORTED以非事务方式执行操作如果当前存在事务就把当前事务挂起NEVER以非事务方式运行如果当前存在事务抛出异常NESTED如果当前存在事务则在嵌套事务内执行。如果当前没有事务则执行 REQUIRED 类似的操作超时时间默认值是-1没有超时限制。如果有以秒为单位进行设置是否只读建议查询时设置为只读 1、只读readOnly 介绍 对一个查询操作来说如果我们把它设置成只读就能够明确告诉数据库 这个操作不涉及写操作,这样数据库就能够针对查询操作来进行优化 使用方式 Transactional(readOnly true) public void buyBook(Integer bookId, Integer userId) { //查询图书的价格 Integer price bookDao.getPriceByBookId(bookId); //更新图书的库存 bookDao.updateStock(bookId); //更新用户的余额 bookDao.updateBalance(userId, price); //System.out.println(1/0); } 注意 对增删改操作设置只读会抛出下面异常 Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modificationare not allowed 2、超时timeout 介绍 事务在执行过程中有可能因为遇到某些问题导致程序卡住从而长时间占用数据库资源 而长时间占用资源大概率是因为程序运行出现了问题可能是Java程序或MySQL数据库或网络连接等等 此时这个很可能出问题的程序应该被回滚撤销它已做的操作事务结束把资源让出来让其他正常程序可以 执行 简单来说就是超时回滚释放资源 使用方式 Transactional(timeout 3) public void buyBook(Integer bookId, Integer userId) { try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } //查询图书的价格 Integer price bookDao.getPriceByBookId(bookId); //更新图书的库存 bookDao.updateStock(bookId); //更新用户的余额 bookDao.updateBalance(userId, price); //System.out.println(1/0); } 观察结果 执行过程中抛出异常 org.springframework.transaction.TransactionTimedOutException: Transaction timed out:deadline was Fri Jun 04 16:25:39 CST 2022 3、回滚策略四种 介绍 声明式事务默认只针对运行时异常回滚编译时异常不回滚 可以通过Transactional中相关属性设置回滚策略 rollbackFor需要设置一个Class类型的对象rollbackForClassName需要设置一个字符串类型的全类名noRollbackFor需要设置一个Class类型的对象rollbackFor需要设置一个字符串类型的全类名 使用方式 Transactional(noRollbackFor ArithmeticException.class) //Transactional(noRollbackForClassName java.lang.ArithmeticException) public void buyBook(Integer bookId, Integer userId) { //查询图书的价格 Integer price bookDao.getPriceByBookId(bookId); //更新图书的库存 bookDao.updateStock(bookId); //更新用户的余额 bookDao.updateBalance(userId, price); System.out.println(1/0); } 观察结果 虽然购买图书功能中出现了数学运算异常ArithmeticException但是我们设置的回滚策略是 当出现ArithmeticException不发生回滚因此购买图书的操作正常执行 4、事务隔离级别Isolation 介绍 数据库系统必须具有隔离并发运行各个事务的能力使它们不会相互影响避免各种并发问题 一个事务与其他事务隔离的程度称为隔离级别SQL标准中规定了多种事务隔离级别 不同隔离级别对应不同的干扰程度隔离级别越高数据一致性就越好但并发性越弱 四种隔离级别 读未提交READ UNCOMMITTED允许Transaction01读取Transaction02未提交的修改。读已提交READ COMMITTED\要求Transaction01只能读取Transaction02已提交的修改。可重复读REPEATABLE READ确保Transaction01可以多次从一个字段中读取到相同的值即Transaction01执行期间禁止其它事务对这个字段进行更新。串行化SERIALIZABLE确保Transaction01可以多次从一个表中读取到相同的行在Transaction01执行期间禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题但性能十分低下。 各个隔离级别解决并发问题的能力见下表 隔离级别 脏读 不可重复读 幻读 READ UNCOMMITTED 有 有 有 READ COMMITTED 无 有 有 REPEATABLE READ 无 无 有 SERIALIZABLE 无 无 无 各种数据库产品对事务隔离级别的支持程度 隔离级别 Oracle MySQL READ UNCOMMITTED × √ READ COMMITTED √默认 √ REPEATABLE READ × √默认 SERIALIZABLE √ √ 使用方式 Transactional(isolation Isolation.DEFAULT)//使用数据库默认的隔离级别 Transactional(isolation Isolation.READ_UNCOMMITTED)//读未提交 Transactional(isolation Isolation.READ_COMMITTED)//读已提交 Transactional(isolation Isolation.REPEATABLE_READ)//可重复读 Transactional(isolation Isolation.SERIALIZABLE)//串行化 5、事务传播行为propagation 介绍 当事务方法被另一个事务方法调用时必须指定事务应该如何传播 测试 1、创建接口CheckoutService public interface CheckoutService { void checkout(Integer[] bookIds, Integer userId); } 2、创建实现类CheckoutServiceImpl Service public class CheckoutServiceImpl implements CheckoutService { Autowired private BookService bookService; Override Transactional //一次购买多本图书 public void checkout(Integer[] bookIds, Integer userId) { for (Integer bookId : bookIds) { bookService.buyBook(bookId, userId); } } } 3、在BookController中添加方法 Autowired private CheckoutService checkoutService;public void checkout(Integer[] bookIds, Integer userId){ checkoutService.checkout(bookIds, userId); } 在数据库中将用户的余额修改为100元 观察结果 可以通过Transactional中的propagation属性设置事务传播行为 修改BookServiceImpl中buyBook()上注解Transactional的propagation属性 Transactional(propagation Propagation.REQUIRED) 默认情况表示如果当前线程上有已经开启的事务可用那么就在这个事务中运行 经过观察购买图书的方法buyBook()在checkout()中被调用checkout()上有事务注解因此在此事务中执行 所购买的两本图书的价格为80和50而用户的余额为100因此在购买第二本图书时余额不足失败导致整个 checkout()回滚即只要有一本书买不了就都买不了 Transactional(propagation Propagation.REQUIRES_NEW) 表示不管当前线程上是否有已经开启的事务都要开启新事务 同样的场景每次购买图书都是在buyBook()的事务中执行因此第一本图书购买成功事务结束 第二本图书购买失败只在第二次的buyBook()中回滚购买第一本图书不受影响即能买几本就买几本 6、总结 基于注解的声明式配置 依赖导入在导入引入spring-orm包的时候就已经导入相关配置现在我们其它的数据源环境搭建完毕后就可 以进行事务配置我们在在Spring的配置文件中添加配置。 bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/property/beantx:annotation-driven transaction-managertransactionManager / transaction-manager属性的默认值是transactionManager 如果事务管理器bean的id正好就是这个默认值则可以省略这个属性 我们需要导入名称空间为 tx 结尾的那个开启事务的注解驱动 从而通过注解Transactional所标识的方法或标识的类中所有的方法都会被事务管理器管理事务。 Transactional注解标识的位置 如果Transactional标识在方法上则只会影响该方法 如果Transactional标识的类上则会影响类中所有的方法 3. 基于XML的Transactional 3.1. 场景模拟 参考基于注解的声明式事务 3.2. 修改 Spring 配置文件 将Spring配置文件中去掉tx:annotation-driven 标签并添加配置 aop:config !-- 配置事务通知和切入点表达式 -- aop:advisor advice-reftxAdvice pointcutexecution(* com.yjxz.spring.tx.xml.service.impl.*.*(..))/aop:advisor/aop:config!-- tx:advice标签配置事务通知 -- !-- id属性给事务通知标签设置唯一标识便于引用 -- !-- transaction-manager属性关联事务管理器 -- tx:advice idtxAdvice transaction-managertransactionManager tx:attributes !-- tx:method标签配置具体的事务方法 -- !-- name属性指定方法名可以使用星号代表多个字符 -- tx:method nameget* read-onlytrue/ tx:method namequery* read-onlytrue/ tx:method namefind* read-onlytrue/ !-- read-only属性设置只读属性 -- !-- rollback-for属性设置回滚的异常 -- !-- no-rollback-for属性设置不回滚的异常 -- !-- isolation属性设置事务的隔离级别 -- !-- timeout属性设置事务的超时属性 -- !-- propagation属性设置事务的传播行为 -- tx:method namesave* read-onlyfalse rollback-forjava.lang.Exception propagationREQUIRES_NEW/ tx:method nameupdate* read-onlyfalse rollback-forjava.lang.Exception propagationREQUIRES_NEW/ tx:method namedelete* read-onlyfalse rollback-forjava.lang.Exception propagationREQUIRES_NEW/ /tx:attributes/tx:advice注意基于xml实现的声明式事务必须引入aspectJ的依赖 dependency groupIdorg.springframework/groupId artifactIdspring-aspects/artifactId version5.3.1/version/dependency
http://www.laogonggong.com/news/120546.html

相关文章:

  • 商城网站类建设哪家好网站如何做关键词引流
  • 网站重新备案需要多长时间2022电商平台排行榜
  • 摄像机怎么在自己家网站做直播兰州画册设计公司
  • 软件技术专业里有网站开发吗sns社交网站
  • 网站开发需要多少钱如何北京网络建站
  • 上海做高端网站wordpress弹窗
  • 新手做自己的网站wordpress 极简 文字
  • 做网站需要准备什么材料网站做推广团队
  • 合肥专业建站wordpress 获取作者名
  • 西安公司网站制作价格大学生做网站类型
  • 英文设计网站线上编程课推荐哪一个
  • 景区类网站如何学网页设计
  • 天水网站制作网站app开发一站式服务
  • 怎么创自己的网站做酒店网站所用到的算法
  • 青岛百度整站优化服务做网站要多少钱新乡
  • 设计公司网站是什么是重要的做的好的微商城网站
  • 厦门做模板网站的公司互联网公司取名
  • Wordpress 仿站 工具wordpress api 跨域
  • 怎么制作手机网页链接站内优化包括哪些
  • 单页网站怎么做竞价网站开发的技术栈
  • 深圳网站建设费用广东网站备案电话号码
  • 中企动力做网站收费标准网页编辑器是什么
  • 安徽网站设计定制网站建设岗位需要解决的问题
  • 网站建设合同英文模板网站建设指导思想和目标
  • 学做网站视频论坛网页制作需要下载什么软件
  • 怎样在网上做网站如何介绍网站模板
  • 建手机网站公司wordpress在线主题导入
  • 汕头定制网站建设关键词提取工具app
  • wamp网站开发做网站page
  • 做都是正品的网站很难吗网站页脚写什么