(sql server补充)关于事务
事务的概念
事务是指单个逻辑工作单元执行的操作的集合。通过事务处理,保证了数据库中数据的一致性。事务需要满足ACID属性,即Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。
原子性
所谓事务的原子性是指同一个事务中所有执行的操作,要么全部成功,要么全都不会执行,即会退回到这个操作执行之前的状态。
一致性
所谓事务的一致性是指一个事务操作执行完成之后,数据库中数据必须处于合法一致的状态中。如果事务在执行时,数据库中的数据没有保持合法一致的状态,即出现了非法的数据,那么数据库管理系统就会把数据库恢复到该事务执行之前的那个合法的状态中。
例如,用户user1只有一个帐户A,帐户A中共有5000元钱,用户user2持有一个帐户B,帐户B中也有5000元钱,帐户A和帐户B中一共有10000元钱,现在用户user1将帐户A中的1000元钱转账给用户user2持有的帐户B中,当转账操作执行完成之后,帐户A中应该还有4000元钱,帐户B中应该有6000元钱。帐户A和帐户B在转账完成之后余款的总和还应该是10000元钱。也就是说,当执行完成这个交易操作之后,数据库从一个合法状态转到了另外一个合法状态中。两个合法状态中帐户A和帐户B的余款总和保持一致。
隔离性
所谓事务的隔离性是指事务看到的数据库中数据要么是这个事务被修改之前的状态,要么是这个事情被修改之后的状态。多个事务可以并发执行,在执行过程中彼此不会受到影响。
事务的隔离性为事务的并发操作中数据的安全性提供了保证。但是隔离级别与数据库的并发性是成反比的。隔离级别越低,数据库的并发性就越好,访问速度越快;隔离级别越高,会导致数据库的并发性越差,访问速度越慢。
持久性
所谓事务的持久性是指如果一个事务被成功的修改,其结果在数据库中不会因为软件、硬件、系统等故障而改变,也不会因为数据库中的其他操作而受到影响。也就是说,事务一旦成功提交,在数据库中的数据就会永久的保持下来。
控制事务
事务控制包括START TRANSCATION、COMMIT、ROLLBACK等语句。使用START TRANSCATION或者BEGIN等语句可以开始一个事务;使用COMMIT语句可以提交一个事务;使用ROLLBACK语句可以回滚一个事务。
开始事务
开始一个事务有两种方式,一种是显式开始,一种是隐式开始。使用START TRANSCATION或者BEGIN等语句开始一个事务,属于显式开始一个事务;在前面讲过的SQL语句中,每一个SQL语句都可以作为包含一条命令的事务,这属于隐式开始一个事务。
提交事务
提交事务可以有三种方式,显式提交、隐式提交和自动提交。显式提交是通过使用COMMIT语句完成的事务的提交;隐式提交是指通过使用SQL语句就可以完成事务的提交;自动提交指通过设置AUTOCOMMIT命令完成事务的提交。下面就来介绍这3种提交方式。
回滚事务
回滚事务是表示当事务执行失败时,数据库将回恢复到该事务操作之前的那一个合法状态中,并撤销该事务对数据库所做的包括增加、修改和删除数据在内的所有更新操作。回滚事务可以使用ROLLBACK语句来完成。回滚事务的语法规则如下:
ROLLBACK [TO 保存点]
其中,ROLLBACK表示用于事务回滚的关键字;TO 保存点是可选的。这里的保存点用来表示回滚部分事务的一种机制。设置保存点后,在执行包括增加、修改和删除数据在内的更新操作时,如果执行过程中没有错误,就继续执行后面的语句;如果执行过程中出现错误,事务就会取消保存点后面的操作,回滚到更新操作之前的保存点。
事务的并发控制
事务的并发控制是指多个用户同时对同一个数据对象(例如,数据表、视图等)进行更新操作。在执行并发操作的过程中,可能会带来一些问题。
事务并发处理中主要存在以下3个方面的问题。
1.读脏数据
2.不能重复读
3.幻象读
为了解决事务并发处理中存在问题,SQL92中定义了4种级别的事务隔离。通过使用事务的隔离级别来解决16.3.2节提到的事务并发处理中存在的问题。
在数据库中可以使用SQL语句设置隔离级别,可以为一个事务设置隔离级别,也可以为一个会话中的每个事务设置隔离级别。