我在创建连接后立即设置con.setAutoCommit(false);
,以便在未提交的数据库中没有任何内容。但事实证明,如果关闭连接,无论你的setAutoCommit()状态是什么,都将提交所有事务。
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");
con.setAutoCommit(false);
st = con.createStatement();
String sql = "INSERT INTO emp (eid, name, dob, address) VALUES (?, ?, ?, ?)";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 8 );
statement.setString(2, "kkk" );
statement.setDate(3, date );
statement.setString(4, "pppp" );
pst = con.prepareStatement(sql);
int rowsInserted = statement.executeUpdate();
//con.commit ();
System.out.println ("rowsInserted "+rowsInserted);
con.close ();
即使在连接关闭时插入了con.commit ();
行,所以我想知道con.commit ();
有什么用?
Another answer表示其特定供应商:
如果在没有显式提交或回滚的情况下关闭Connection; JDBC并不特别强制要求任何内容,因此行为取决于数据库供应商。如果是Oracle,则会发出隐含提交。
没有意义。谢谢。
答案 0 :(得分:1)
AutoCommit
是一个显式提交,您可以在必须提交事务时调用它。在您的情况下,虽然您已将false
设置为<script>
$(document).ready(function () {
var data = {
labels: [
""
],
datasets: [
{
data: [165],
backgroundColor: [
"#FF6384"
],
hoverBackgroundColor: [
"#FF6384"
]
}]
};
var ctx = $('#chart-area').get(0).getContext("2d");
var myDoughnutChart = new Chart(ctx, {
type: 'doughnut',
data: data,
animation: true,
responsive: true,
showTooltips: false,
percentageInnerCutout: 70,
segmentShowStroke: false,
onAnimationComplete: function () {
var canvasWidthvar = $('#chart-area').width();
var canvasHeight = $('#chart-area').height();
var constant = 114;
var fontsize = (canvasHeight / constant).toFixed(2);
//ctx.font="2.8em Verdana";
ctx.font = fontsize + "em Verdana";
ctx.textBaseline = "middle";
var total = 0;
$.each(data, function () {
total += parseInt(this.value, 10);
});
var tpercentage = ((data[0].value / total) * 100).toFixed(2) + "%";
console.log(total);
var textWidth = ctx.measureText(tpercentage).width;
var txtPosx = Math.round((canvasWidthvar - textWidth) / 2);
ctx.fillText(tpercentage, txtPosx, canvasHeight / 2);
}
});
});
,但没有明确的提交或回滚。 Oracle数据库提交会话的所有事务,这些事务优雅地退出连接。如果会话异常终止,则会回滚事务。
答案 1 :(得分:1)
Oracle documentation提供了一个非常好的解释,说明何时以及为何应该使用它。请仔细阅读!
如果JDBC连接是以编程方式或默认情况下处于自动提交模式(默认情况下为fyi),则每个SQL语句在完成后都会提交给数据库。
您可以参考this问题获取有关同一主题的更详细说明。
答案 2 :(得分:1)
注销Oracle会提交任何待处理的事务。无论您是通过conn.close()
使用sqlplus还是JDBC驱动程序,都会发生这种情况。请注意,它不是发出提交服务器的驱动程序。在注销期间,服务器会提交挂起的更改。在Java程序中,如果要确保未提交挂起的更改,则可以在调用conn.rollback()
之前调用conn.close()
。
您问conn.commit()
有什么用?它用于在业务逻辑的特定点显式提交事务。例如,如果在连接池中缓存连接,则可以在将连接释放回池之前禁用自动提交并提交挂起的更改。有些人更喜欢启用自动提交模式(这是JDBC中的默认模式),而不用担心显式提交或回滚更改。这取决于您的业务逻辑。您可以问自己:我是否需要回滚DML执行?如果答案是肯定的,那么你应该禁用自动提交并显式提交事务。