我有2 tables
,它会同时更新。
作为一个具有多对多关系的employee table and a department table
示例,因此当新员工添加到表中时,他的部门将插入到第三个表中。现在我首先将部分员工详细信息插入员工表,然后获取该员工ID,然后将其与部门详细信息相结合,我将其插入员工部门表。
为此,我目前使用3个独立的SQL查询。如果在上一个查询(employee-department)
中发生错误或者无法获得最后插入的员工,我需要回滚第一个插入(员工)。我可以用我当前的查询(delete on failure as another query)
来实现这一点,或者如果我使用存储过程来完成整个过程,它会更干净吗?
提前感谢:)
答案 0 :(得分:0)
使用 PDO交易
PDO::beginTransaction() - 启动交易
PDO::commit() - 提交交易 PDO::rollBack() - 回滚交易
$dbh->beginTransaction();
/* Change the database schema and data */
//...your all queries
/* Recognize mistake and roll back changes */
$dbh->rollBack();
答案 1 :(得分:0)
您是否直接从JSP使用JDBC?我希望不会......在任何情况下,Spring JDBC都有一些很好的JDBC帮助器。您想要使用JdbcTemplate和DataSourceTransactionManager。
这是一个简单的例子(不要指望它可以编译,只是为了让你去...)
DataSource dataSource = getDataSourceFromSomewhere();
DataSourceTransactionManager tm = new DataSourceTransactionManager(dataSource);
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
TransactionStatus tx = tm.getTransaction(new DefaultTransactionDefinition());
int update1 = jdbc.update("insert into employee...");
int employeeId = jdbc.queryForInt(select id from employee...");
int update2 = jdbc.update("insert into employee_department...");
if (employeeId > 0 && update2 > 0)
tm.commit(tx);
else
tm.rollback(tx);
如果您不想使用Spring(或不能),普通的旧JDBC可以做同样的事情:
Connection conn = getConnectionFromSomewhere()
... do a bunch of work ...
if (work was successful)
conn.commit();
else
conn.rollback();
我认为使用Spring JDBC库比使用普通的旧JDBC更容易。