一个事务的例子:
tim要给bill转账100块钱:
1.检查tim的账户余额是否大于100块;
2.tim的账户减少100块;
3.bill的账户增加100块;
这三个操作就是一个事务,必须打包执行,要么全部成功,要么全部不执行,其中任何一个操作的失败都会导致所有三个操作“不执行”——回滚。
事务的ACID特性
原子性:
一个事务必须保证其中的操作要么全部执行,要么全部回滚,不可能存在只执行了一部分这种情况出现。
一致性:
数据必须保证从一种一致性的状态转换为另一种一致性状态 。
比如上一个事务中执行了第二步时系统崩溃了,数据也不会出现bill的账户少了100块,但是tim的账户没变的情况。要么维持原装(全部回滚),要么bill少了100块同时tim多了100块,只有这两种一致性状态的。
隔离性:
在一个事务未执行完毕时,通常会保证其他Session 无法看到这个事务的执行结果。
持久性:
事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
在多用户都用事务同时访问同一个数据资源的情况下,有可能造成以下几种数据错误:
不可重复读:
如果一个用户在一个事务中多次读取一条数据,而另外一个用户则同时更新啦这条数据,造成第一个用户多次读取数据不一致。
脏读:
第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新完成,那么第一个事务读取的数据将是一半为更新过的,一半还没更新过的数据,这样的数据毫无意义。
幻读:
第一个事务读取一个结果集后,第二个事务,对这个结果集经行增删操作,然而第一个事务中再次对这个结果集进行查询时,数据发现丢失或新增。
然而数据库锁,就是为解决这些问题所生的,他的存在使得一个事务对他自己的数据块进行操作的时候,而另外一个事务则不能插足这些数据块。这就是所谓的

本文介绍了SQLServer中事务的ACID特性,包括原子性、一致性、隔离性和持久性。详细阐述了数据库锁的种类,如共享锁、排它锁、更新锁以及意向锁,分析了它们的作用和避免数据错误的场景。并提供了锁兼容性图表和锁粒度的参考资料,还通过实例演示了不同锁类型在查询和更新操作中的应用,以及如何处理死锁问题。

401

被折叠的 条评论
为什么被折叠?



