Connection对象事务的提交(commit)和回滚(rollback)

在JDBC中,Connection对象默认开启自动提交事务。若需批量处理SQL语句,需关闭自动提交,通过setAutoCommit(false)。之后,使用commit()提交事务,发生错误时调用rollback()进行回滚,以撤销所有更改。了解更多详情可参考相关博客文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看jdk1.8_api:

数据库连接connection对象的创建默认是设置自动提交事务的:

connection对象默认处于自动提交,意味着它执行每个语句后自动提交更改,即setAutoCommit(true),如果想同时执行多条语句需要将自动提交关闭setAutoCommit(false),当想要提交SQL语句的更改是调用commit()方法.

 

 

默认的setAutoCommit()方法:

 

关闭自动提交后,想要提交时的需要调用的方法commit()

 当操作出现错误的时候回滚(回滚会撤销此前事务对数据的操作回到最初的状态):

 

实例:

package store.service.serviceImp;

import java.sql.Connection;
import java.sql.SQLException;

import store.dao.OrderDao;
import store.dao.daoImp.OrderDaoImp;
import store.domain.OrderItem;
import store.domain.Orders;
import store.service.OrderService;
import store.utils.JDBCUtils;

public class OrderServiceImp implements OrderService{

	@Override
	public void save(Orders orders) throws SQLException {
		// TODO 自动生成的方法存根
		Connection cnn = null ;
		try {
			
			//获取数据库连接
			 cnn = JDBCUtils.getConnection();
			//开启事务
			 cnn.setAutoCommit(false);    //禁止每条语句自动提交
			//保存订单
			 OrderDao orderDao = new OrderDaoImp();
			 orderDao.saveOrder(cnn,orders);
			for (OrderItem orderItem : orders.getList()) {
				orderDao.saveOrderItem(cnn,orderItem);
				
			}
			 
			//提交事务
			cnn.commit();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			//回滚
			cnn.rollback();
			e.printStackTrace();
		}
		
		
	}

}

 

 

自动提交事务和手动提交事务:https://blog.youkuaiyun.com/qq_33824312/article/details/78346980

### SQL 事务提交后的不可回滚特性 一旦事务提交,其对数据库所作的所有更改即刻变得永久化并对外可见[^3]。这意味着,在事务成功提交之后,任何情况下都不能再对该次提交操作进行回滚。 对于未提交事务而言,只要尚未调用 `COMMIT` 命令,则仍有机会通过执行 `ROLLBACK` 来撤销自上次提交以来所有的变更[^2]。然而,这仅适用于那些处于挂起状态下的修改;一旦这些改动经由 `COMMIT` 被确认保存至数据库中,它们便成为了历史记录的一部分,无法逆转。 当涉及到并发控制时,隔离级别确保了一个正在运行中的事务不会受到其他同时发生的事务的影响直到完成自己的提交回滚过程[^5]。因此,在多用户环境中保持良好的事务设计非常重要,以防止不必要的锁定其他潜在问题的发生。 为了更好地理解这一点,下面给出一段简单的 Python SQLAlchemy 的例子来展示如何正确地管理处理事务: ```python from sqlalchemy import create_engine, text engine = create_engine('sqlite:///example.db') with engine.connect() as connection: transaction = connection.begin() try: result = connection.execute(text("INSERT INTO users (name) VALUES ('Alice')")) # 更多的操作... transaction.commit() # 提交事务 # 尝试在此处回滚将会失败,因为事务已经被提交 # transaction.rollback() except Exception as e: transaction.rollback() # 如果有错误则回滚整个事务 raise e ``` 在这个例子中,可以看到只有在尝试提交之前才能安全地决定是否要回滚当前正在进行的工作。一旦调用了 `commit()` 方法,就不能再对其进行任何形式上的撤消操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值