ThinkPHP -- 事务

ThinkPHP事务

  • 数据库:MySQL

事务是什么?

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务用来管理 insert,update,delete 语句

事务需要满足的条件

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

    + 事务的原子性:一组事务,要么成功;要么撤回。
    + 稳定性 :有非法数据(外键约束之类),事务撤回。
    + 隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
    + 可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

事务的操作

Sql启用事务操作


        + BEGIN 开始一个事务
        + ROLLBACK 事务回滚
        + COMMIT 事务确认

开始事务:其实我们没写的 insert,update,delete 操作都是事务,而在MySQL中是自动提交commit操作的,因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交.

Thinkphp启用事务操作

        + 开启事务方法startTrans()
        + 事务提交方法commit()
        + 事务回滚方法rollback()

在sql语句中我们也可以用SET AUTOCOMMIT=0 禁止自动提交和SET AUTOCOMMIT=1 开启自动提交来代替事务

Thinkphp中事务的应用

在我们需要提前知道数据的情况下进行操作.
比如:我们只允许数据库添加10条数据,多的我们不让它插入.

 public function addUser()
    {
        if (empty(I('post.'))) {
            return false;
        } else {
            $User = M('user');
            $User->startTrans();//开启事务
            $data = I('post.');
            $add = $Starimg->add($data);
            $num = $Starimg->select();
            if ($add && count($num) <= 10) {
                $User->commit();//事务提交
                return true;
            } else {
                $User->rollback();//事务回滚
                return false;
            }
        }
    }

我的理解:开始事务后,先执行添加,然后对执行后返回的结果进行条件判断,满足条件则提交事务,不满足则回滚,所谓的回滚就是:这个添加已经执行了,回滚就是让它返回执行前的一个状态.(类似版本管理)

事务的控制语句

  • BEGIN或START TRANSACTION;显式地开启一个事务;
  • COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
  • ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  • SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
  • RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  • ROLLBACK TO identifier;把事务回滚到标记点;
  • SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

(我们常用的可能就是BEGIN ROLLBACK COMMIT这些,其它的我们现在不常用,等到我们用的时候就可以不用到处去找了)


好久没写博客了,语法都生疏了.在学校后面忙着搞毕业的杂七杂八的事情,上班了,都得适应杂七杂八的东西.

Edit with markdown