我理解他们为什么好,但他们是否在现实世界中使用?
如果是这样,创建嵌套事务时它们有多大用处?有什么好处?
例如(一个非常宽松的例子),说我正在创建一个数据库,目的是帮助其他人理解SQL(假设)。
所以我需要编写一个脚本来创建数据库,创建模式,为每个模式创建表,为每个模式创建序列,用有效信息填充表,然后结束脚本。
因此,在执行此操作时,我会将我的批次分解为依次运行,例如。
use master; go
create databse testdb; go
use testdb; go
create table tbl(XYZ); go
insert into tbl (XYZ)
values (XYZ); go
现在,在那个区块中我将使用交易,为什么要嵌套它们?
提前致谢, 我很感激帮助。
答案 0 :(得分:3)
如果您无法确保所有语句都成功执行,那么事务是一件好事。基本上,这是总是的情况。
您实际上无法避免的错误:错误,超时,死锁。如果其中一个发生,您希望撤消所做的所有修改并报告错误。您不想要调试存在的数据损坏问题,因为某些代码只执行了一半。
除了原子性之外还有其他用途:您可能希望隔离事务,检测冲突的事务,使冲突的事务彼此等待并使用锁实现互斥。大多数反式是DML,而不是DDL(从实践中讲)。有些trans 只是用于读取数据库的一致时间不变快照。
答案 1 :(得分:2)
事务用于确保一组DML(数据操作语言)语句的一致性。如果某些内容失败(例如,因为您尝试创建重复键),则会回滚整个事务,例如,您没有没有明细行的订单标题。您可以选择使用ROLLBACK语句手动回滚。
事务的另一个用途是数据库恢复。如果数据库崩溃,通常会出现不一致的情况。恢复操作将回滚未完成的事务。
DDL(数据定义语言)语句(如CREATE TABLE)通常在自己的事务中执行 - 您不希望将数据字典保持在不一致的状态。
在您的示例中,唯一可能的事务是围绕INSERT。执行INSERT时将自动创建事务。如果您的系统没有打开自动提交并且您无法提交插入,则您的数据将永远不会进入数据库。
嵌套事务用于复杂情况,在这种情况下,您可能希望将插入回滚到子表中并执行其他操作(例如请求其他用户输入),而不必回滚父表上的事务。
答案 2 :(得分:0)
使用create db,如果有错误,您可以简单地删除表,这样您就不需要使用事务了......
当你试图在多个sql语句中保持原子性时,它们非常有用。