我最近开始研究基于Kohana框架的应用程序,该框架已经开发了几个月,而且代码没有使用任何数据库事务。我已经看到了数据损坏。
通过手动添加事务的所有代码将是一个冗长且容易出错的任务,因此我的计划是实现类似Java EE和Spring框架中的声明性事务:简单地将每个控制器操作包装在数据库事务中使用项目特定的控制器超类的before()和after()函数。也许可以通过包含需要事务的操作名称的可覆盖属性进行配置。
答案 0 :(得分:1)
它看起来不像Kohanas ORM有交易支持,但你仍然可以手动拨打电话
$db->query("START TRANSACTION");
$db->query(query1);
$db->query(query2);
$db->query("COMMIT");
我看了一下,如果有异常,似乎没有调用after方法,如果你查看here并搜索'after',你会看到一些代码,你会看到它语句不运行after()方法。
我真的不确定如何在没有其他权衡的情况下让它变得全球化......
答案 1 :(得分:0)
在许多情况下,使用控制器基类的before()
和after()
函数可以工作,但在处理异常时,我对于不进行显式回滚感到不安。然后我发现每当一个名为Request::current()->redirect()
的动作因为该函数执行exit
时我也会得到隐式回滚,因此永远不会调用after()
。
我的新改进解决方案是覆盖Kohana的Request类,我创建了一个 Kohana模块,这样每个人都可以轻松使用它: