假设我想在两个不同的表中保存删除两个元素,所以我必须创建事务。我的问题是我必须把PreparedStatement元素放在哪里?我必须这样说(我的意思是在交易中)connection_database.setAutoCommit(false);connection_database.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);PreparedStatement p1.......PreparedStatement p2;p1.execute();p2.execute();connessione_db.commit();connessione_db.setAutoCommit(true);或者我可以这样说吗?PreparedStatement p1.......PreparedStatement p2;connection_database.setAutoCommit(false);connection_database.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);p1.execute();p2.execute();connessione_db.commit();connessione_db.setAutoCommit(true);第一种方式PreparedStatement在交易中创建第二种方式创建PreparedStatement是出交易。任何人都可以帮助我吗?
2 回答
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
在符合标准的 JDBC 实现中,您可以使用任一顺序:准备好的语句的生命周期比事务长,并且在事务提交后应该可以重用。
但是,在准备语句之前首先禁用自动提交可能更有效,具体取决于驱动程序和数据库系统。这可能取决于驱动程序在准备语句时是否需要事务。如果驱动程序在准备时需要一个事务,那么在准备这两个语句的过程中,在准备之后禁用自动提交可能已经启动(并提交)了一两个事务,但是如果您在禁用自动提交之后准备它们,准备可能会使用与随后用于实际执行的相同事务。
![?](http://img1.sycdn.imooc.com/545862e700016daa02200220-100-100.jpg)
交互式爱情
TA贡献1712条经验 获得超3个赞
语句对象可以共享,也可以缓存。所以你提供的代码没有问题。只要确保它们被放在 try catch 块中,所以如果不成功,它将被回滚。
如果不成功,平面事务将回滚,就像您的情况一样。嵌套事务从一个点提交到另一个点,因此只能部分回滚。您可以使用第二段代码。无需使事务可序列化,尝试根据您是进行读取还是写入以及您的要求根据时间戳锁定。
添加回答
举报
0/150
提交
取消