SQL开启事务处理的语句 START TRANSACTION 和BEGIN TRAN的区别

问答SQL开启事务处理的语句 START TRANSACTION 和BEGIN TRAN的区别
王利头 管理员 asked 11 月 ago
3 个回答
Mark Owen 管理员 answered 11 月 ago

当我们操作数据库时,有时需要确保一组操作要么全部成功,要么全部失败,这时就需要用到事务处理机制。在SQL中,开启事务处理的语句有两种:START TRANSACTION和BEGIN TRAN。它们在功能和用法上基本相同,但也有细微的差别。

语法

  • START TRANSACTION

    START TRANSACTION [transaction_name]

  • BEGIN TRAN

    BEGIN TRAN [transaction_name]

两者都可以指定一个可选的transaction_name,用于标识事务。如果省略transaction_name,则系统将自动生成一个。

执行顺序

  • START TRANSACTION 会立即执行,而BEGIN TRAN会在遇到COMMITROLLBACK语句后才执行。

这意味着使用START TRANSACTION开启的事务会立即生效,而使用BEGIN TRAN开启的事务只会隐式生效。

可嵌套性

  • START TRANSACTION支持嵌套事务,即在一个事务中再开启另一个事务。
  • BEGIN TRAN不支持嵌套事务。

这对于需要在复杂操作中进行细粒度控制事务的情况非常有用。

显式与隐式提交

  • 使用START TRANSACTION开启的事务需要显式提交(COMMIT)或回滚(ROLLBACK),否则事务不会结束。
  • 使用BEGIN TRAN开启的事务在遇到COMMITROLLBACK以外的任何数据操作语句时都会隐式提交。

这种差异使得START TRANSACTION更适用于需要对事务有更细粒度控制的情况,而BEGIN TRAN更适用于简单的操作,不需要显式管理事务。

示例

“`sql
— 使用 START TRANSACTION 显式开启事务
START TRANSACTION;
— 执行操作
INSERT INTO table1 VALUES (1, ‘John’);
— 显式提交事务
COMMIT;

— 使用 BEGIN TRAN 隐式开启事务
BEGIN TRAN;
— 执行操作
UPDATE table1 SET name = ‘Mary’ WHERE id = 1;
— 执行另一个操作
DELETE FROM table2 WHERE id = 2;
— 隐式提交事务(因为遇到了数据操作语句)
“`

总结

总的来说,START TRANSACTIONBEGIN TRAN都是开启SQL事务处理的语句,但它们在细微之处有所不同:

  • 执行顺序: START TRANSACTION 立即执行,而 BEGIN TRAN 隐式执行。
  • 可嵌套性: START TRANSACTION 支持嵌套事务,而 BEGIN TRAN 不支持。
  • 显式与隐式提交: START TRANSACTION 需要显式提交或回滚,而 BEGIN TRAN 在遇到数据操作语句时会隐式提交。

在选择使用哪种语句时,需要考虑所要执行的操作及其对事务控制的需求。

seoer788 管理员 answered 11 月 ago

START TRANSACTION 和 BEGIN TRAN 的区别

引言

在 SQL 中,事务处理是一种将数据库中的操作组合到一个逻辑单元中的机制,要么全部成功,要么全部失败。这确保了数据的完整性和一致性。

为了开启一个事务,我们需要使用专用语句。本文将探讨 SQL 中开启事务处理的两种主要语句:START TRANSACTIONBEGIN TRAN,并深入分析它们的异同。

START TRANSACTION

START TRANSACTION 是 ANSI SQL 标准中定义的语句,用于开启一个事务。它是 SQL Server、MySQL 和 Oracle 等大多数关系数据库管理系统 (RDBMS) 支持的。

语法:

sql
START TRANSACTION

特点:

  • 显式语法:START TRANSACTION 语句很明确地指出事务的开始,有助于提高代码的可读性和可维护性。
  • 跨平台兼容性:作为 ANSI SQL 标准的一部分,START TRANSACTION 在广泛的 RDBMS 上通用,简化了跨平台开发。

BEGIN TRAN

BEGIN TRAN 是 Microsoft SQL Server 特有的语句,用于开启一个事务。它不是 ANSI SQL 标准的一部分。

语法:

sql
BEGIN TRAN [transaction_name]

特点:

  • 隐式语法:BEGIN TRAN 语句省略了 “TRANSACTION” 关键字,可以使代码更简洁。
  • 仅限 SQL Server:BEGIN TRAN 仅在 Microsoft SQL Server 中受支持,因此不适用于其他 RDBMS。
  • 可选的事务名称:BEGIN TRAN 允许指定一个可选的事务名称,这在调试或故障排除时很有用。

异同

START TRANSACTIONBEGIN TRAN 的主要区别如下:

| 特征 | START TRANSACTION | BEGIN TRAN |
|—|—|—|
| ANSI 标准 | 是 | 否 |
| 跨平台兼容性 | 是 | 否 |
| 语法显式性 | 明确 | 隐式 |
| 事务名称 | 不支持 | 支持(可选) |

使用建议

在大多数情况下,建议使用 START TRANSACTION,因为它符合 ANSI SQL 标准,并具有跨平台兼容性。然而,在只能使用 Microsoft SQL Server 的场景中,BEGIN TRAN 可以是一个可行的选择,因为它提供了指定事务名称的选项。

结论

START TRANSACTIONBEGIN TRAN 都是有效的 SQL 语句,用于开启一个事务。START TRANSACTION 符合 ANSI 标准并具有跨平台兼容性,而 BEGIN TRAN 仅限于 Microsoft SQL Server,但提供了可选的事务名称。在选择哪种语句时,考虑具体的数据库环境和所需的兼容性至关重要。

ismydata 管理员 answered 11 月 ago

在SQL中,事务处理是一项至关重要的机制,它允许一系列查询或操作作为单个逻辑单元执行。事务确保在数据库中执行的所有操作要么全部成功,要么全部失败,从而保持数据的完整性和一致性。SQL有两种语句可以用来开启一个事务:START TRANSACTION和BEGIN TRAN。虽然这两个语句在功能上相似,但它们之间还是有一些微妙的区别,了解这些区别有助于你选择最适合特定需求的语句。

语法

  • START TRANSACTION
  • BEGIN TRAN

作用

这两个语句的作用都是开启一个事务,但BEGIN TRAN的作用更加全面。除了开启事务之外,BEGIN TRAN还会隐式地为当前会话设置默认的隔离级别,而START TRANSACTION则需要显式地指定隔离级别。

隔离级别

隔离级别决定了事务对其他同时运行的事务的可见性。SQL提供了4个隔离级别:

  • 未提交读(READ UNCOMMITTED):事务可以读取其他未提交事务中执行的更改。
  • 已提交读(READ COMMITTED):事务只能读取已提交的事务中执行的更改。
  • 可重复读(REPEATABLE READ):事务在开始时创建的一个快照,它只能读取该快照中的数据,即使其他事务已经提交了更改。
  • 串行化(SERIALIZABLE):事务执行时串行化,这意味着在事务执行期间,其他事务会被阻塞。

隐式设置隔离级别

BEGIN TRAN会隐式地将隔离级别设置为当前会话的默认隔离级别。默认隔离级别由数据库服务器配置,通常是已提交读。START TRANSACTION则不会设置隔离级别,需要显式指定隔离级别。

显式设置隔离级别

START TRANSACTION允许你显式地设置隔离级别。例如:

sql
START TRANSACTION ISOLATION LEVEL READ COMMITTED;

这将开启一个事务,并将隔离级别设置为已提交读。

其他区别

  • ROLLBACK和COMMIT的行为:在事务内,ROLLBACK用于回滚事务中执行的所有更改,而COMMIT用于提交事务中执行的更改。START TRANSACTION和BEGIN TRAN对ROLLBACK和COMMIT的行为没有影响。
  • 嵌套事务:在同一个会话中,可以嵌套多个事务。START TRANSACTION和BEGIN TRAN都可以用于开启嵌套事务。
  • 命名事务:某些数据库系统支持给事务命名。START TRANSACTION和BEGIN TRAN都支持为事务命名。

使用建议

一般来说,为了更好的可读性和更明确的意图,建议使用BEGIN TRAN来开启事务。然而,在需要显式设置隔离级别的情况下,可以使用START TRANSACTION。

总结

START TRANSACTION和BEGIN TRAN都是用于开启SQL事务的语句。BEGIN TRAN的作用更加全面,因为它会隐式地为当前会话设置默认的隔离级别。START TRANSACTION则需要显式地指定隔离级别。在通常情况下,推荐使用BEGIN TRAN,但在需要显式设置隔离级别时,可以考虑使用START TRANSACTION。

公众号