数据库事务虽然概念简单,使用也不复杂,但是很重要,我感觉有必要在文档中提一下。
数据库事务就是当你需要一次性完成多条update和delete数据库操作时,为了保证数据能一次性正确完成,Mysql提供的一种机制。使用过程是先开启一个事务Db::startTrans();,然后编写SQL语句进行update和delete,如果都能预处理成功,你可以进行Db::commit();提交事务,数据库才会真实处理所有的SQL语句,如果你发现中间有异常或者错误,你可以进行Db::rollback();回滚并停止事务。
五颗星!!!!!
如果你一次性需要处理多条update和delete的数据库操作,请一定要使用数据库事务机制。这样,才能保证数据的正确性。否则任何一种意外情况都将产生数据的错误。举个例子,Laytp中管理员管理,添加管理员的操作,需要同时添加管理员表lt_admin_user和管理员与角色关系表lt_admin_role_user。如果在这个操作中,没有使用事务,当程序把管理员表lt_admin_user添加完毕了,突然网络不稳定,程序与数据库连接中断了,管理员与角色关系表lt_admin_role_user的数据就不会添加成功。如果使用了事务,只要没有执行Db::commit();,之前执行了的SQL语句仅仅只是预处理执行,Mysql中是不会仅看到管理员表lt_admin_user添加成功而管理员与角色关系表lt_admin_role_user添加不成功这种情况的。
Laytp中推荐使用数据库事务的代码如下:
// 这个类是LayTp 4.x新增的类,为了解决ThinkPHP中Db::startTrans();这些方法在编辑器中不提示的问题use app\helper\Db;// 不是LayTp 4.x版本需要使用如下的类// use think\facade\Db;Db::startTrans();try {$res1 = Db::table('table_name')->delete(1);if(!$res1) throw new \Exception('错误提示文字1');$res2 = Db::table('table_name')->delete(2);if(!$res2) throw new \Exception('错误提示文字2');Db::commit();return $this->success('操作成功');} catch (\Exception $e) {Db::rollback();return $this->exceptionError($e);}