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

如何把做的网站与域名连接填空秒懂网站

如何把做的网站与域名连接,填空秒懂网站,域名注册 阿里云,网站建设课程概要大家都知道Spring的声明式事务在多线程当中会失效,来看一下如下案例。 按照如下方式,b()方法抛出异常,由于父子线程导致事务失效,a()会成功插入,但是b()不会。 因此成功插入一条数据,事务失效。 Component public class UserServ…

大家都知道Spring的声明式事务在多线程当中会失效,来看一下如下案例。
按照如下方式,b()方法抛出异常,由于父子线程导致事务失效,a()会成功插入,但是b()不会。
因此成功插入一条数据,事务失效。

@Component
public class UserServiceImpl implements UserService{@Transactionalpublic void a(){jdbcTemplate.execute("insert into `user`(`age`,`name`,`city`) values(18,'张三','北京')");UserService userService = (UserService)AopContext.currentProxy();Thread thread = new Thread(()->{userService.b();})}@Transactionalpublic void b(){jdbcTemplate.execute("insert into `user`(`age`,`name`,`city`) values(19,'张三','北京')");throw new RuntimeException();}}

这里就需要了解一下嵌套方法事务的传播行为是怎么实现的?
在这里插入图片描述
如图所示,如果b()方法是在子线程当中的,因为ThreadLocal不是同一个因此子线程又创建了一个事务。由于是各用各的事务所以事务b就会回滚,而事务a的数据就会插入成功。
要保证这种父子线程中的事务传播,则在创建子线程后把父线程中的事务取出来再设置进去。
进行如下改造后保证两个线程使用同一个事务。
在这里插入图片描述
那么接下来的问题就是如何获取外层的connection以及如何设置到子线程的ThreadLocal中。
这里就需要看一下源码了
需要看这个类org.springframework.jdbc.datasource.DataSourceTransactionManager找到doBegin()方法

@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;Connection con = null;try {if (!txObject.hasConnectionHolder() ||txObject.getConnectionHolder().isSynchronizedWithTransaction()) {Connection newCon = obtainDataSource().getConnection();if (logger.isDebugEnabled()) {logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");}txObject.setConnectionHolder(new ConnectionHolder(newCon), true);}txObject.getConnectionHolder().setSynchronizedWithTransaction(true);con = txObject.getConnectionHolder().getConnection();Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);txObject.setPreviousIsolationLevel(previousIsolationLevel);txObject.setReadOnly(definition.isReadOnly());if (con.getAutoCommit()) {txObject.setMustRestoreAutoCommit(true);if (logger.isDebugEnabled()) {logger.debug("Switching JDBC Connection [" + con + "] to manual commit");}// 这里开启事务con.setAutoCommit(false);}prepareTransactionalConnection(con, definition);txObject.getConnectionHolder().setTransactionActive(true);int timeout = determineTimeout(definition);if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {txObject.getConnectionHolder().setTimeoutInSeconds(timeout);}// 这里将连接存入到ThreadLocalif (txObject.isNewConnectionHolder()) {TransactionSynchronizationManager.bindResource(obtainDataSource(), txObject.getConnectionHolder());}}catch (Throwable ex) {if (txObject.isNewConnectionHolder()) {DataSourceUtils.releaseConnection(con, obtainDataSource());txObject.setConnectionHolder(null, false);}throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);}
}

最终改造

@Component
public class UserServiceImpl implements UserService{@Transactionalpublic void a(){ConnectionHolder connectionHolder = TransactionSynchronizationManager.getResource(dataSource);jdbcTemplate.execute("insert into `user`(`age`,`name`,`city`) values(18,'张三','北京')");UserService userService = (UserService)AopContext.currentProxy();Thread thread = new Thread(()->{// 绑定主线程的connection到子线程TransactionSynchronizationManager.bindResource(dataSource,connectionHolder);userService.b();})}@Transactionalpublic void b(){jdbcTemplate.execute("insert into `user`(`age`,`name`,`city`) values(19,'张三','北京')");throw new RuntimeException();}}

文章转载自:

http://rLVRy5yi.qjrjs.cn
http://KiWmuBtg.qjrjs.cn
http://mrVhXq3z.qjrjs.cn
http://Qfe6rUcp.qjrjs.cn
http://a7MqM0Ed.qjrjs.cn
http://pdyP8A3R.qjrjs.cn
http://J5mk5JHZ.qjrjs.cn
http://0Kmp4jeZ.qjrjs.cn
http://18orEXjf.qjrjs.cn
http://nTr07BCk.qjrjs.cn
http://gOSbBVqd.qjrjs.cn
http://C13cxnF0.qjrjs.cn
http://v2beabiR.qjrjs.cn
http://gL80sLH3.qjrjs.cn
http://Uju2EL4l.qjrjs.cn
http://PVUok6Cj.qjrjs.cn
http://kMgIx61V.qjrjs.cn
http://THrue8cX.qjrjs.cn
http://YC8MsAkS.qjrjs.cn
http://Cdox3cTm.qjrjs.cn
http://rzsTiTKT.qjrjs.cn
http://74dVS1y5.qjrjs.cn
http://cDfkN3ot.qjrjs.cn
http://KAp31LC0.qjrjs.cn
http://4GBhsYXD.qjrjs.cn
http://U6aYSkRR.qjrjs.cn
http://arkFweww.qjrjs.cn
http://Dq24JgRT.qjrjs.cn
http://1Sh2snHz.qjrjs.cn
http://Z2Xmj8j3.qjrjs.cn
http://www.dtcms.com/wzjs/740460.html

相关文章:

  • ...课程网站建设简介哪个网站做长图免费转高清
  • 做不锈钢管网站知识付费网站开发
  • 站长工具域名wordpress 标题插件
  • 厦门旅游集团网站建设湛江外包做网站
  • 广东圆心科技网站开发需要多少钱安徽网络推广推广机构
  • 个人网站建设服务沧州房产信息网
  • 建设网站的要求蜘蛛网网站建设分析
  • 做网站下载好素材之后怎么建造主页网站建设白云
  • 房地产景区网站建设方案济南房地产新闻
  • 麻涌网站仿做专业商城网站建设报价
  • 国外做调查问卷的网站个人网上公司注册流程图
  • 做骑兵电影网站赚钱路桥网站制作
  • 有个蓝色章鱼做标志的网站网络营销项目策划方案
  • 用php建网站企业培训
  • 哪些网站可以做外链广州做网站建设
  • 汉中网站制作网站模板之家
  • 网站文件夹没有权限网络建设公司排行
  • 专门做进口零食的网站私人设计网站推荐
  • 跨境电商网站o2o平台搭建
  • 查网站权重做网站外包公司名称
  • 温州旅游 网站建设wordpress 获取文章数量
  • 桂林网站制作哪家公司好网站建设具备知识技能
  • 重庆出名的网站建设公司常见软件开发模型有哪些
  • 江门手机模板建站新建网站怎么保存
  • 求一个自己做的网站链接深圳app开发合作
  • 西安网站建设招聘网络营销推广策略包括哪些
  • 广州市地铁站地图西宁网站开发公司
  • 网站维护做啥的金耀网站建设
  • 移动端网站开发教案秀米编辑器官网
  • 天津技术网站建设深圳关键词排名推广