php嵌入frame,PHP框架ORM 解决事务嵌套问题

>我们做项目的过程中,难免无意中会在事务中嵌套了事务。

比如封装了一个funcA()方法,funcA()方法里包含了一个事务。然后我们在业务代码里写了一个事务,且在事务中调用了funcA()。这样就形成了事务嵌套。

但是在[MySQL官方文档](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)中有明确的说明不支持嵌套事务

![](http://image.gwalker.cn/article_2018-12-186445c185d0ddb2bb29053.jpg)

也就是说,当执行一个START TRANSACTION指令时,会隐式的执行一个commit操作。不能进行事务嵌套。

现在一些注流PHP开发框架,为了解决方法调用产生的mysql事务嵌套问题。对这个进行了处理。处理方法一般是定义了一个**"务指令数"记数器**。把被嵌套的事务,到消掉。Thinkphp源码原理实现如下:

```php

abstract class Driver

{

// 事务指令数

protected $transTimes = 0;

....

/**

* 启动事务

* @access public

* @return void

*/

public function startTrans()

{

$this->initConnect(true);

if (!$this->_linkID) {

return false;

}

//数据rollback 支持

if (0 == $this->transTimes) {

// 记录当前操作PDO

$this->transPdo = $this->_linkID;

$this->_linkID->beginTransaction();

}

$this->transTimes++;

return;

}

/**

* 用于非自动提交状态下面的查询提交

* @access public

* @return boolean

*/

public function commit()

{

if (1 == $this->transTimes) {

// 由嵌套事物的最外层进行提交

$result = $this->_linkID->commit();

$this->transTimes = 0;

$this->transPdo = null;

if (!$result) {

$this->error();

return false;

}

} else {

$this->transTimes = $this->transTimes <= 0 ? 0 : $this->transTimes - 1;

}

return true;

}

/**

* 事务回滚

* @access public

* @return boolean

*/

public function rollback()

{

if ($this->transTimes > 0) {

$result = $this->_linkID->rollback();

$this->transTimes = 0;

$this->transPdo = null;

if (!$result) {

$this->error();

return false;

}

}

return true;

}

...

}

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django框架ORM(Object-Relational Mapping)是一种将对象模型与关系数据库模型进行映射的技术。其目的是让开发者使用面向对象的方式来操作数据库,而不必直接使用SQL语句。 Django的ORM实现了以下功能: 1. 定义模型:使用Django定义模型的方式非常简单,只需要创建一个继承自`django.db.models.Model`的类,并定义它的属性即可。 2. 数据库迁移:当你修改了模型之后,Django会自动帮你生成数据库迁移文件,这些文件可以在数据库中创建或修改表结构。 3. 数据库查询:使用Django ORM可以进行复杂的数据库查询,包括过滤、排序、分组等操作。 4. 数据库操作:Django ORM提供了对数据库的增删改查操作,可以方便地完成对数据的操作。 下面是一个使用Django ORM的例子: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateField() ``` 在上面的例子中,我们定义了两个模型:`Author`和`Book`。`Author`模型有`name`和`email`两个属性,`Book`模型有`title`、`author`和`published_date`三个属性。其中,`author`属性是一个外键,它与`Author`模型建立了关联关系。 通过Django ORM,我们可以进行如下操作: 1. 创建模型表结构 ```python python manage.py makemigrations python manage.py migrate ``` 2. 添加数据 ```python author1 = Author(name='John', email='[email protected]') author1.save() book1 = Book(title='Django for Beginners', author=author1, published_date='2020-01-01') book1.save() ``` 3. 查询数据 ```python # 获取所有的作者 authors = Author.objects.all() # 获取所有的书籍 books = Book.objects.all() # 获取指定作者的所有书籍 author = Author.objects.get(name='John') books = Book.objects.filter(author=author) # 按照发布日期倒序排序 books = Book.objects.order_by('-published_date') ``` 4. 修改数据 ```python book = Book.objects.get(title='Django for Beginners') book.title = 'Django for Experts' book.save() ``` 5. 删除数据 ```python book = Book.objects.get(title='Django for Experts') book.delete() author = Author.objects.get(name='John') author.delete() ``` 总之,Django ORM可以让我们更加方便地操作数据库,提高开发效率。同时,它也具有良好的可扩展性和可维护性,可以应对各种复杂的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值