1.事物:
(1)事务:保持逻辑数据一致性与可恢复性,必不可少的利器。
(2)对事物的理解:在一个事务中,你写啦2条sql语句,一条是修改订单表状态,一条是修改库存表库存-1 。 如果在修改订单表状态的时候出错,事务能够回滚,数据将恢复到没修改之前的数据状态,下面的修改库存也就不执行,这样确保你关系逻辑的一致,安全。。
(3)事务具有原子性,一致性,隔离性,持久性。
原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
一致性:事务结束的时候,所有的内部数据都是正确的。
隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据。
持久性:事务提交之后,数据是永久性的,不可再回滚。
(4)然而在SQL Server中事务被分为3类常见的事务:
自动提交事务:是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理,你应该没有见过,一条Update 修改2个字段的语句,只修该了1个字段而另外一个字段没有修改。。
显式事务:T-sql标明,由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。
隐式事务:使用Set IMPLICIT_TRANSACTIONS ON 将将隐式事务模式打开,不用Begin Transaction开启事务,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可。
2.锁
锁定从数据库系统的角度大致可以分为6种:
共享锁(S):还可以叫他读锁。可以并发读取数据,但不能修改数据。也就是说当数据资源上存在共享锁的时候,所有的事务都不能对这个资源进行修改,直到数据读取完成,共享锁释放。
排它锁(X):还可以叫他独占锁、写锁。就是如果你对数据资源进行增删改操作时,不允许其它任何事务操作这块资源,直到排它锁被释放,防止同时对同一资源进行多重操作。
更新锁(U):防止出现死锁的锁模式,两个事务对一个数据资源进行先读取在修改的情况下,使用共享锁和排它锁有时会出现死锁现象,而使用更新锁则可以避免死锁的出现。资源的更新锁一次只能分配给一个事务,如果需要对资源进行修改,更新锁会变成排他锁,否则变为共享锁。
意向锁:SQL Server需要在层次结构中的底层资源上(如行,列)获取共享锁,排它锁,更新锁。例如表级放置了意向共享锁,就表示事务要对表的页或行上使用共享锁。在表的某一行上上放置意向锁,可以防止其它事务获取其它不兼容的的锁。意向锁可以提高性能,因为数据引擎不需要检测资源的每一列每一行,就能判断是否可以获取到该资源的兼容锁。意向锁包括三种类型:意向共享锁(IS),意向排他锁(IX),意向排他共享锁(SIX)。
架构锁:防止修改表结构时,并发访问的锁。
大容量更新锁:允许多个线程将大容量数据并发的插入到同一个表中,在加载的同时,不允许其它进程访问该表。
减少死锁的发生,提高数据库性能
1.按照同一顺序访问数据库资源,上述例子就不会发生死锁啦
2.保持是事物的简短,尽量不要让一个事物处理过去复杂的读写增长,容易与操作。事物过于复杂,占用资源会增多,处理时间增长,容易与其他事物冲突,提升死锁概率。
3.尽量减少数据库的并发量。。
4.尽可能使用分区表,分区视图,把数据防止在不同的磁盘和文件组中,分散访问保存在不同分区的数据,减少因为表中放置锁而造成的 其他事物长时间等待。
5.避免占用时间很长并且表复杂的数据操作。
6.使用较低的个立即被,使用较低的隔离级别比使用较高的隔离别持有共享锁的事件更短。这样就减少了锁的争用。
7.尽量不要在事务中要求响应,比如修改新增数据之后再完成整个事务的提交,这样延长事务占用资源的事件,也会提升死锁的概率。