PHP系统声明式事务处理
1.数据库事务
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。事务具有以下4个基本特征:● Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。● Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。● Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。● Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。
2.实现数据库事务管理的方式
2.1 编码式事务在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关方法就是编码式事务管理。编码式事务管理需要程序员在具体的业务代码中显式调用事务管理的相关方法,并显式地根据各种条件来判断是提交还是回滚。这种方式在业务简单的系统中还可应付,对于业务复杂的系统可能会因为少了某些条件判断导致错误的提交或回滚,尤其对于业务需求变动极其频繁的系统可能会因为判断条件没有及时根据业务的调整而修改而导致错误的提交和回滚。由于编码式事务存在需要将事务管理与业务逻辑代码耦合,并且难以判断或及时更新回滚条件,甚至出现意料之外的事务嵌套等原因,因此不推荐使用编码式方式管理事务。
2.2 声明式事务TP系统的声明式事务管理机制在底层是建立在TP框架的行为扩展机制之上的。其实质是在控制器的目标方法执行前开启事务,在执行完控制器的目标方法之后根据实际情形提交或回滚事务。
声明式事务最大的优点就是不需要在具体的业务逻辑代码中搀杂事务管理的代码,只需在模块配置中声明需要开启事务管理的方法,即可将事务运用到业务逻辑中。
3.TP项目的声明式事务处理机制的实现
1)在系统常量配置中增加两个常量:// 开启数据库事务define('DB_TRANS_ENABLE', true);// 数据库事务全局标志define('DB_TRANS_VAR', 'tx_comment');
具体可查看相关代码。
3)在MyActionBeginBehavior的run方法中根据系统全局事务开关和模块配置判断是否开启数据库事务// 开启数据库事务 by 凡墙<jihaoju@qq.com> 2015.09.14 18:05$db_trans_enable = C('DB_TRANS_ENABLE');if(defined('DB_TRANS_ENABLE') && DB_TRANS_ENABLE && is_array($db_trans_enable) && in_array(strtolower(CONTROLLER_NAME . '.' . ACTION_NAME), $db_trans_enable)) { env(DB_TRANS_VAR, true); M()->startTrans();}
// 处理数据库事务 by 凡墙<jihaoju@qq.com> 2015.09.14 18:05$db_trans_enable = C('DB_TRANS_ENABLE');if(defined('DB_TRANS_ENABLE') && DB_TRANS_ENABLE && is_array($db_trans_enable) && in_array(strtolower(CONTROLLER_NAME . '.' . ACTION_NAME), $db_trans_enable)) { $tx_commit = env(DB_TRANS_VAR); if ($tx_commit === false) { // 回滚 M()->rollback(); } else { // 提交事务 M()->commit(); }}
在需要强制回滚的代码处将环境变量 DB_TRANS_VAR 的值设为 false,则系统将在目的方法结束后回滚。
4.存在的问题
4.1 数据库读写分离数据库读写分离后,按TP框架的机制,一次请求将至少创建两个数据库连接,因此目前的声明式事务实现机制需要针对读连接和写连接分别根据需要管理事务。
4.2 事务控制的细度和编码式事务相比,声明式事务的最细粒度只能浸入到控制器的方法级别,没法做到像编码式事务那样可以浸入到代码块级别,甚至无法做到对非控制器的方法的事务管理。待扩展。
4.3 事务对数据的影响
幻读phantom read:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;不可重复读unrepeatable read:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务修改后的记录;脏读dirty read:事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。幻读、不可重复读、脏读等问题可通过数据库的事务隔离级别解决,待优化。
需要注意的是,若在数据模型层对数据做了缓存处理,系统开启事务后可能导致“脏数据”的问题,因此对于一些重要数据字段的读写不能依赖于缓存中的数据。
4.4 分布式事务数据库分库分表或系统采用微服务架构后将出现分布式事务问题。待研究。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

HTTP请求方法包括GET、POST、PUT和DELETE,分别用于获取、提交、更新和删除资源。1.GET方法用于获取资源,适用于读取操作。2.POST方法用于提交数据,常用于创建新资源。3.PUT方法用于更新资源,适用于完整更新。4.DELETE方法用于删除资源,适用于删除操作。

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

箭头函数在PHP7.4中引入,是短闭包的简化形式。1)它们使用=>运算符定义,省略function和use关键字。2)箭头函数自动捕获当前作用域变量,无需use关键字。3)它们常用于回调函数和短小计算,提高代码简洁性和可读性。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。
