A. 关系型数据库和非关系型区别
关系型数据库和非关系型在成本、查询速率、储存格式、可扩展性、数据一致绝行性、事务处理上有区别。
B. 标准sql规范中定义的四个事务隔离级别
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:
◆未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
◆授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
◆可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
◆序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
通过前面的介绍已经知道,通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。所以,数据库隔离级别的选取镇此就显得尤为重要,在选取数据库的隔离级别时,应该注意以下几个处理的原则:
首先,必须排除“未授权读取”,因为在多个事务之间使用它将会是非常危险的。事务的回滚操作或失败将会影响到其他并发事务。第一个事务的回滚将会完全将其他事务的操作清除,甚至使数据库处在一个不一致的状态。很可能一个已回滚为结束的事务对数据的修改最后却修改提交了,因为“未授权读取”允许其他事务读取数据,最后整个错误状态在其他事务之间传播开来。
其次,绝大部分应用都无须使用“序列化御液迅”隔离(一般来说,读取幻影数据并不是一个问题),此隔离级别也难以测量。目前使用序列化隔离的应用中,一般都使用悲观锁,这样强行使所有事务都序列化执行。
剩下的也就是在“授权读取”和“可重复读取”之间选择了。我们先考虑可重复读取。如果所有的数据访问都是在统一的原子数据库事务中,此隔离级别将消除一个事务在另外一个并发事务过程中覆盖数据的可能性(第二个事务更新丢失问题)。这是一个非常重要的问题,但是使用可重复读取并不是解决问题的途径。
假设使用了“版本数据”,Hibernate会自动使用版本数据。Hibernate的一级Session缓存和版本数据已经为你提供了“可重复读取隔离”绝大部分的特性。特别是,版本数据可以防止二次更新丢失的问题,一级Session缓存可以保证持久载入数据的状态与其他事务对数据的修改隔离开来,因此如果使用对所有的数据库事务采用授权读取隔离和版本数据是行得通的。
“可重复读取”为数据库查询提供了更好的效率(仅对那些长时间的数据库事务),但是由于幻影读取依然存在,因此没必要使用它(对于Web应用来说,一般也很少在一个数据库事务中对同一个表查询两次)。
也可以同时考虑选择使用Hibernate的二级缓存,它可以如同底层埋斗的数据库事务一样提供相同的事务隔离,但是它可能弱化隔离。假如在二级缓存大量使用缓存并发策略,它并不提供重复读取语义(例如,后面章节中将要讨论的读写,特别是非严格读写),很容易可以选择默认的隔离级别:因为无论如何都无法实现“可重复读取”,因此就更没有必要拖慢数据库了。另一方面,可能对关键类不采用二级缓存,或者采用一个完全的事务缓存,提供“可重复读取隔离”。那么在业务中需要使用到“可重复读取”吗?如果你喜欢,当然可以那样做,但更多的时候并没有必要花费这个代价。
C. sqlserver中事务的作用是什么
sql server中事务的作用是如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。是指访问并可能更新数据库中各种数据项的一个程序逻辑执行单元(unit)。
(3)csql事务处理扩展阅读:
事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
D. 在SQL中怎样使用事务
SQL Server 需要显示的定义 开始一个事务.
BEGIN TRANSACTION;
例如:
1> BEGIN TRY
2> -- SQL Server 需要显示的定义 开始一个事务.
3> BEGIN TRANSACTION;
4> -- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
5> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7> -- 执行成功后,需要提交事务.
8> COMMIT;
9> END TRY
10> BEGIN CATCH
11> PRINT('Main.错误代码 = ' + STR(ERROR_NUMBER()));
12> PRINT('Main.错误严重级别 = ' + STR(ERROR_SEVERITY()));
13> PRINT('Main.错误状态代码 = ' + STR(ERROR_STATE()));
14> PRINT('Main.错误信息 = ' + ERROR_MESSAGE());
15> -- 回滚事务
16> ROLLBACK;
17> END CATCH
18>
19> go
E. SQL 对事务的管理包括哪几方面
首先你得了解什么是事务?
第一点:事务是一种机制.是一个操作序列,它包含一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交或撤消,即这一组数据库命令要么都执行,要么都不执行.
第二点:你要了解事务的4个属性,即ACID
原子性:事务是一个完整的操作
一致性:当事务完成时,数据是必须处于一致状态
隔离性:对数据进修改的所有并发事务是彼此隔离的.
持久性:事务完成后,它对于系统的影响是永久的.
而你问如何管理事务,主要由下列语句
1.开始事务:begin tran
2.提交事务:commit tran
3.回滚事务:rollback tran
至于如何运用这些语句,其实很简单,你在编写事务SQL语句时,一定会存在if语句,也就是说,你认为对的,是正确的,就写上提交事务,你认为错了就回滚事务,但这些必须是语句最开头写上开始事务!