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

怎么给公司做微网站/营销策划36计

怎么给公司做微网站,营销策划36计,汕头室内设计公司排名,vs2015做简单网站文章目录写在之前laravel之嵌套事务transactions实现调用示例:代码分析:总结:SAVEPOINT 使用demo如下:写在之前 关于mysql 的事务嵌套可以查看这个地址: https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.ht…

文章目录

    • 写在之前
    • laravel之嵌套事务transactions实现
      • 调用示例:
      • 代码分析:
      • 总结:
    • SAVEPOINT 使用demo如下:

写在之前

关于mysql 的事务嵌套可以查看这个地址:
https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html

里面有这么一句话。

Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or one of its synonyms.

大体意思是db不支持事务嵌套,如果你嵌套执行START TRANSACTION时会隐式执行commit

我们做个测试:

mysql>  BEGIN;
Query OK, 0 rows affected (0.16 sec)mysql> INSERT INTO T2 VALUES(300);
Query OK, 1 row affected (0.29 sec)mysql>  BEGIN;
Query OK, 0 rows affected (0.04 sec)mysql> rollback;
Query OK, 0 rows affected (0.04 sec)mysql> SELECT * FROM T2;
+------+
| ID   |
+------+
|  300 |
+------+
2 rows in set (0.04 sec)

果然,我们直接rollback上面的语句,但是还是执行了查询操作。

laravel之嵌套事务transactions实现

为啥官网不支持,但是 laravel 框架却优雅的实现了事务嵌套,我们来看看它的实现原理。

调用示例:

\DB::beginTransaction();    //主事务
try{\DB::beginTransaction(); //子事务\DB::insert('insert into T2 set ID=100');\DB::rollBack();         //子事务回滚\DB::insert('insert into T2 set ID=200');\DB::commit();
}catch (\Exception $e) {\DB::rollBack();echo $e->getMessage();exit;
}

查看执行结果:

mysql> SELECT * FROM T2;
+------+
| ID   |
+------+
|  100 |
+------+
1 row in set (0.05 sec)

说明子事务成功回滚了,下面看下子事务的实现。

代码分析:

laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php 90行

public function beginTransaction(){$this->createTransaction();$this->transactions++;$this->fireConnectionEvent('beganTransaction');}

每调一次beginTransaction会使this−>transactions加1接着看一下this->transactions加1 接着看一下this>transactions1this->createTransaction();的实现

/*** Create a transaction within the database.** @return void*/protected function createTransaction(){if ($this->transactions == 0) {try {$this->getPdo()->beginTransaction();} catch (Exception $e) {$this->handleBeginTransactionException($e);}} elseif ($this->transactions >= 1 && $this->queryGrammar->supportsSavepoints()) {$this->createSavepoint();}}

if ($this->transactions == 0) 首先判断是否在事务中。

没有在事务中则执行 $this->getPdo()->beginTransaction()
相当于执行 BEGIN;

在事务中执行 $this->createSavepoint(); 下面是createSavepoint方法的实现。

/*** Create a save point within the database.** @return void*/protected function createSavepoint(){$this->getPdo()->exec($this->queryGrammar->compileSavepoint('trans'.($this->transactions + 1)));}

这里相当于在mysql里执行 SAVEPOINT trans1;

下面看下rollback方法实现:

public function rollBack($toLevel = null)
{$toLevel = is_null($toLevel)? $this->transactions - 1: $toLevel;if ($toLevel < 0 || $toLevel >= $this->transactions) {return;}$this->performRollBack($toLevel);$this->transactions = $toLevel;$this->fireConnectionEvent('rollingBack');
}

首先rollback会使this−&gt;transactions减一。然后调用this-&gt;transactions减一。 然后调用this>transactionsthis->performRollBack

protected function performRollBack($toLevel)
{if ($toLevel == 0) {$this->getPdo()->rollBack();} elseif ($this->queryGrammar->supportsSavepoints()) {$this->getPdo()->exec($this->queryGrammar->compileSavepointRollBack('trans'.($toLevel + 1)));}
}

performRollBack方式实际就是在重新设定savepoint值。

下面看下commit的实现:

/*** Commit the active database transaction.** @return void*/
public function commit()
{if ($this->transactions == 1) {$this->getPdo()->commit();}$this->transactions = max(0, $this->transactions - 1);$this->fireConnectionEvent('committed');
}

commit方法,只有在最外层时才会真正的提交。

总结:

  1. 基本实现原理是 savepoint
  2. 通过$this->transactions对应的数值设定 不同的savepoint实现不同层次嵌套
  3. 只有在最后一个commit时才会真正提交请求。

SAVEPOINT 使用demo如下:

mysql> CREATE TABLE T2(ID INT);
Query OK, 0 rows affected (0.05 sec)mysql> select * from T2;
Empty set (0.17 sec)mysql> BEGIN;
Query OK, 0 rows affected (0.04 sec)mysql> INSERT INTO T2 VALUES(100);
Query OK, 1 row affected (0.04 sec)mysql> SAVEPOINT trans1;
Query OK, 0 rows affected (0.04 sec)mysql> INSERT INTO T2 VALUES(200);
Query OK, 1 row affected (0.04 sec)mysql> ROLLBACK TO SAVEPOINT trans1;
Query OK, 0 rows affected (0.04 sec)mysql> RELEASE SAVEPOINT trans1;
Query OK, 0 rows affected (0.03 sec)mysql> commit;
Query OK, 0 rows affected (0.04 sec)mysql> SELECT * FROM T2;
+------+
| ID   |
+------+
|  100 |
+------+
1 row in set (0.05 sec)
http://www.jmfq.cn/news/4785265.html

相关文章:

  • 建设小说网站费用/广州专业网络推广公司
  • 电影里的做视频在线观看网站/seo视频教程百度网盘
  • ps做网站框架搭建/b2b网站平台
  • 房产大全/seo在线外链
  • 沈阳网页设计招聘/seo新人怎么发外链
  • 网站建设流程所用工具/手机百度seo快速排名
  • 茂名模板建站代理/网站推广的基本方法有哪些
  • 网站推广的方法和技巧/长尾词在线挖掘
  • 网站建设的目标是什么 提供了哪些栏目/汕头网站推广排名
  • 五金东莞网站建设技术支持/今日nba比赛直播
  • nginx缓存方案 WordPress/武汉seo排名优化公司
  • 学校网站建设费计入什么科目/企业培训考试平台官网
  • 陕西 网站建设 陕ICP/百度公司是国企还是私企
  • 网站拓展关键词怎么做/每日新闻简报
  • 松岗做网站/站内推广方案
  • 网站做定向的作用/怎么开展网络营销推广
  • 蕉城区建设局政府信息公开网站/网络营销推广外包平台
  • 上海怎样做网站/新闻头条今日要闻国内新闻最新
  • 苏州网站优化推广/网站关键词全国各地的排名情况
  • 无锡网站制作推荐/免费网络项目资源网
  • app推广营销公司/seo优化排名百度教程
  • 做网站好的公司有哪些/口碑营销的产品
  • discuz 旅游网站模版/企业的网络推广
  • 泉州手机模板建站/营销培训讲师
  • wordpress 图片比例/互联网关键词优化
  • wordpress顶部滑动/搜索引擎优化关键词
  • 网站的开发方法/站长seo工具
  • django做的购物网站/推广普通话手抄报简单又好看内容
  • au网站怎么注册/2024年8月爆发新的大流行病毒吗
  • 长沙广告网页设计最新招聘信息/seo站长网怎么下载