2013-02-11 29 views
2

我想模拟使用java的数据库恢复子系统。但是,我有以下问题。END事务和COMMIT事务之间的区别

每当开始交易发布时,是否总是有必要进行结束交易? (就像下面的例子)

b1 --- Begin txn 1 
r1(X) --- Read item X using txn 1 
e1 --- End txn 1 

根据上面的例子,我没有发出Commit事务语句。那么,我的交易会成功还是失败?如果上面的例子如下,

b1 --- Begin txn 1 
r1(X) --- Read item X using txn 1 
c1 --- commit txn 1 

end和commit有什么区别?

如果您需要更多信息,请让我知道。

+2

SQL Server(T-SQL)没有命令'END TRANSACTION'。 – 2013-02-11 05:37:02

+0

标签属于标签区域,而不是问题标题。 – 2013-02-11 07:42:42

回答

8

要么你ROLLBACK一个交易或COMMIT交易。我希望你不会把它与BEGIN和END块混淆,这不是一个交易,与Transaction at All无关。

我相信大多数数据库....仍然以ROLL BACK或COMMIT结束。

希望这会有所帮助。

+0

感谢您的回复。实际上,在我正在实现的数据库子系统中,每当遇到END时,我都必须在该事务的日志文件中写入更改。在遇到COMMIT之后,应将实际更改写入磁盘块。 – Ramesh 2013-02-12 17:48:15

0

'结束'用于结束程序/功能。这个陈述被执行是很重要的。
'Commit'用于永久保存交易中的所有更改。
例如,您使用SQL语句创建或删除了一个表,您需要提交这些更改。

在这里阅读更多关于提交声明。
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm

+0

你错了。事务不*结束*,它们要么被提交要么被回滚,[甚至在Oracle中](http://docs.oracle.com/cd/E11882_01/server.112/e10713/transact.htm#autoId7“事务概述控制(Oracle)“)(这也不是问题似乎瞄准的平台)。 – 2013-02-11 07:10:45

+0

哦,我的坏,我的意思是这个过程。对不起,谢谢。 – 2013-02-11 07:40:25

0

对于从这样的一个程序内部发出SQL事务,END语句直接关闭交易。意味着交易已经完成,没有更多应该发生。 COMMIT语句实际上告诉数据库您希望事务更改是永久的。

如果您处于“autocommit”模式,则不需要COMMIT语句,因为应该提交每个查询/语句。

有关COMMIT的更多信息,请参阅here

如果您使用ODBC进行数据库连接,则可以找到关于事务管理的信息here

另外这个question已经被问过。

+0

我想模拟一个数据库恢复子系统。因此,用户事务以开始,读取,写入,结束,提交和放弃的形式给出。我必须为每个这些用户事务编写一个算法。我不确定要写什么来作为“结束”的算法。我觉得没有用户发布的“结束”,因为用户正在发出“提交”或“中止”。所以,我想知道是否真的需要“结束”。 – Ramesh 2013-02-11 06:22:12

-1

请参阅本LINK的细节

QUOTE: BEGIN TRANS和END TRANS开始和结束交易。他们不指定一个新的代码块;他们只标记交易界限。

1

BEGIN/END划定了一段代码,而不控制事务。如果不在事务内部,则每个语句都将在自治事务中执行。通常BEGIN/END与分支/循环指令(IF/WHILE)一起使用。

BEGIN TRANSACTION/COMMIT TRANSACTION表示事务的开始:此块中每条语句都在同一事务中执行的,不能提交或回滚独立。

0

开始和结束事务的确切命令名取决于您使用的特定数据库(不幸)。

例如:

SQLite,您使用开始/ BEGIN TRANSACTION开始,和END/END TRANSACTION/COMMIT/COMMIT TRANSACTION结束事务。

MySQL中,您使用START TRANSACTION/BEGIN/BEGIN WORK和COMMIT/COMMIT WORK进行相同操作。

相关问题