当以编程方式触发 运行 时间异常时,事务不会回滚
Transaction is not rolled back when run time exception programmatically fired
我无法理解为什么抛出运行时异常时调用DBConnectionFilter
的after()
函数。我期待调用 onException()
函数并回滚事务。但真正发生的是 after()
函数将被调用以提交事务并关闭数据库连接,然后调用全局过滤器/ CatchAllFilter/kind 中的 onException
函数。
AppControllerConfig class:
public class AppControllerConfig extends AbstractControllerConfig{
public void init(AppContext context) {
add(new CatchAllFilter(), new DBConnectionFilter("default",true));
}
}
PeopleController 创建函数:
@POST
public void create() throws IOException {
String incomingPost = Util.read(getRequestInputStream());
Map[] people = JsonHelper.toMaps(incomingPost);
Person newPerson = new Person();
newPerson.fromMap(people[0]);
boolean response = newPerson.save();
//Making sure person info is persisted so that it can be Rolled back
if (response == true) {
throw new InitException("Rollback Transaction");
}
render("/system/RestIndex").noLayout().contentType("application/json");
view("jsonResponse", Person.findAll().toJson(true));
}
所以,查看ActiveWeb的代码,我可以看到事务先回滚,然后提交。我假设一旦事务回滚,驱动程序将丢弃尚未提交的数据,但在我的测试中 MariaDB/MySQL 并没有发生这种情况。换句话说,我在笔记本电脑上用一个简单的 ActiveWeb 项目复制了这个问题。因此,提交了这个错误:https://github.com/javalite/activeweb/issues/389 and already fixed. You can pull a new 2.1-SNAPSHOT version from: http://repo.javalite.io/org/javalite/activeweb/,它应该可以工作。
我无法理解为什么抛出运行时异常时调用DBConnectionFilter
的after()
函数。我期待调用 onException()
函数并回滚事务。但真正发生的是 after()
函数将被调用以提交事务并关闭数据库连接,然后调用全局过滤器/ CatchAllFilter/kind 中的 onException
函数。
AppControllerConfig class:
public class AppControllerConfig extends AbstractControllerConfig{
public void init(AppContext context) {
add(new CatchAllFilter(), new DBConnectionFilter("default",true));
}
}
PeopleController 创建函数:
@POST
public void create() throws IOException {
String incomingPost = Util.read(getRequestInputStream());
Map[] people = JsonHelper.toMaps(incomingPost);
Person newPerson = new Person();
newPerson.fromMap(people[0]);
boolean response = newPerson.save();
//Making sure person info is persisted so that it can be Rolled back
if (response == true) {
throw new InitException("Rollback Transaction");
}
render("/system/RestIndex").noLayout().contentType("application/json");
view("jsonResponse", Person.findAll().toJson(true));
}
所以,查看ActiveWeb的代码,我可以看到事务先回滚,然后提交。我假设一旦事务回滚,驱动程序将丢弃尚未提交的数据,但在我的测试中 MariaDB/MySQL 并没有发生这种情况。换句话说,我在笔记本电脑上用一个简单的 ActiveWeb 项目复制了这个问题。因此,提交了这个错误:https://github.com/javalite/activeweb/issues/389 and already fixed. You can pull a new 2.1-SNAPSHOT version from: http://repo.javalite.io/org/javalite/activeweb/,它应该可以工作。