ThinkPHP -- 事务

  • angus
  • 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