SQL事务回滚的两种方式

1.XACT_ABORT

1)set XACT_ABORT off时,回滚产生错误的Transact-SQL语句,而事务将继续进行处理,(注:错误严重或者语法错误时可能回滚整个事务)

2) set XACT_ABORT ON时,如果Transact-SQL语句产生运行时错误,整个事务将终止并回滚,

步骤1:

CREATE TABLE [dbo].[A](
	[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[Name] [nvarchar](5) NULL,
	[CreateDate] [datetime] NULL,
 CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

--默认XACT_ABORT=off
SET XACT_ABORT off
begin tran
insert into [dbo].[A](Name,CreateDate) values('测试off',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试off_异常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试off',GETDATE());
commit tran


(1 行受影响)
消息 8152,级别 16,状态 4,第 3 行
将截断字符串或二进制数据。
语句已终止。

(1 行受影响)

select * from [dbo].[A]
IDNameCreateDate
1         测试off

 2018-10-31 15:06:09.330

3测试off2018-10-31 15:06:09.333

 

注意:

事务的回滚对于拥有自增主键的表来说,insert的数据是被删除,update和delete的数据是被恢复  。所以上面所显示的ID=3 。

步骤2:

set XACT_ABORT  ON
begin tran
insert into [dbo].[A](Name,CreateDate) values('测试on',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试on_异常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试on',GETDATE());
commit tran

同样执行select 查询语句  得到如下结果

IDNameCreateDate
1         测试off

 2018-10-31 15:06:09.330

3测试off2018-10-31 15:06:09.333

证明事务全部回滚成功。(注意下次新增数据的时候,ID的值。。。)

 

2.rollback

在sql中用事务的时候一般是这么写。
 

declare @error int ;
begin tran
begin try
insert into [dbo].[A](Name,CreateDate) values('测试异常',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试异常_错误',GETDATE());
insert into [dbo].[A](Name,CreateDate) values('测试异常',GETDATE());
end try
begin catch
set @error=1
end catch
if @error>0
	rollback tran
else
	commit tran

注:

判断事务回滚,则整个事务里面的sql语句一起回滚,跟SET XACT_ABORT ON相似,不同的是当事务进行嵌套时,如果用事务判断的方法,嵌套的子事务不出错,外面语句出错,那么整个事务只会回滚外面出错的语句,子事务提交成功了就回滚不了了,但是用SET XACT_ABORT ON,即使子事务提交成功,如果外围事务出错,子事务还是回滚.

 

 

batchUpdate sql 是指一次性执行多个 SQL 语句的操作,通常用于批量插入、更新、删除等操作。在 Java 中,可以使用 JDBC 的 Batch 操作来实现 batchUpdate sql。 以下是 batchUpdate sql 的示例代码: ``` String[] sqls = {"INSERT INTO user(name, age) VALUES ('Tom', 20)", "INSERT INTO user(name, age) VALUES ('Jerry', 22)", "UPDATE user SET age = 21 WHERE name = 'Tom'", "DELETE FROM user WHERE name = 'Jerry'"}; Connection conn = null; PreparedStatement ps = null; try { conn = DriverManager.getConnection(url, username, password); conn.setAutoCommit(false); // 手动提交事务 ps = conn.prepareStatement(""); // 创建一个空的 PreparedStatement 对象 for (String sql : sqls) { ps.addBatch(sql); // 将 SQL 语句添加到批处理中 } int[] results = ps.executeBatch(); // 执行批处理并返回结果数组 conn.commit(); // 提交事务 System.out.println("batchUpdate sql 执行成功!共影响 " + results.length + " 条数据。"); } catch (SQLException e) { conn.rollback(); // 回滚事务 e.printStackTrace(); } finally { // 关闭连接和 PreparedStatement 对象 } ``` 在上面的示例中,我们首先定义了一个包含多条 SQL 语句的数组 sqls,然后使用 JDBC 的 Connection 和 PreparedStatement 对象实现了批处理操作。在 for 循环中,我们将每条 SQL 语句添加到 PreparedStatement 对象的批处理中,最后通过 executeBatch() 方法一次性执行所有 SQL 语句,并返回结果数组。如果批处理执行成功,则会提交事务并输出结果信息;否则会回滚事务并输出异常信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值