【SQL】SQL Server 的事务
显式事务通过 BEGIN TRANSACTION 语句
开始,当连接发出后续 COMMIT TRANSACTION
或 ROLLBACK TRANSACTION
语句时,主控服务器请求 MS DTC 在所涉及的服务器的管理分布式事务的完成
要么全部完成,要么全部失败。
完成事务:
COMMIT TRANSACTION
回滚事务:
ROLLBACK TRANSACTION
BEGIN TRY BEGIN TRANSACTION --中间是inser、update、delete等操作 COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION; END CATCH;
事务的问题:并发的脏读、不可重复读、幻读;
事务的隔离级别
1 READ UNCOMMITTED 级别 (不隔离,不阻止修改,读取)
该级别不会隔离数据,即事务正在使用的数据,其他事务也能同时对该事物进行修改和删除;使用 READ UNCOMMITTED 级别运行的事务不会发出共享锁来防止其他事务读取或更改数据;
2. READ COMMITTED 级别 (不能读正修改的,不脏读,修改的会锁定)
使用该隔离级别能设定不能读取其他事务正在修改但未提交的数据,这样就不会出现脏读的问题;其他的事务能在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻读;使用 READ COMMITTED 隔离读取事务,事务中的数据仍可能被修改,但已被修改过的数据将一直被锁定,直到事务结束;READ COMMITTED 是 SQL Server 数据库中的默认事务隔离级别;
3. REPEATABLE READ 级别 (有共享锁)
该级别的隔离能指定语句不能读取已被其他事务修改但未提交的行,并指定其他事务都不能修改当前事务正在读取的数据,摘掉当前事务结束;该事务中的每一条语句读取到的每一个数据都设置共享锁;共享锁直到事务完成,这样能防止其他事务修改当前读取的任何行;
4. SERIALIZABLE 级别 (最高级别,锁数据,操作要排队)
这是 SQL Server 中隔离级别最高的,它将所需要使用到的全部数据都进行锁定,这个事务在使用时,别的事务完全不允许添加、删除和修改数据;SERIALIZABLE 等级的隔离事务的并发性最低,但若同一数据要被多个事务使用,就需要让事务进行排队等待;
可使用 SET 语句更改事务的隔离级别,语法格式如下所示: