什么是数据库的事务? - Go语言中文社区

什么是数据库的事务?


事务

事务是作为单个工作单元而执行的一系列操作,如查询和修改数据,甚至是修改数据的定义。

定义数据边界的方式有显式和隐式两种。显式事务的定义需要以BEGIN TRAN语句作为开始。如果想提交事务,则应该以COMMIT TRAN语句显式结束事务;如果不想提高事务,则以ROLLBACK TRAN语句显式结束事务。

如果不显式定义事务边界,SQLServer会默认把每一条语句作为一个事务。

事务必须有四种属性:原子性,一致性,隔离性,持久性

原子性:在事务中进行的修改,要么全部执行,要么全不执行。如果在事务完成之前系统出现故障,SQLServer会撤销在事务中的修改。

一致性:为了事务在查询和修改时数据不发生冲突。

隔离性:隔离性是一种用于控制数据访问的机制,能够确保事务只能访问处于期望的一致性级别下的数据。SQLServer使用锁对各个事务之间正在修改和查询的数据进行隔离。

持久性:在将数据修改写入到磁盘之前,总是先把这些修改写入到事务日志中。这样子,即使数据还没有写入到磁盘中,也可以认为事务是持久化的。这是如果系统重新启动,SQL Server也会检查数据库日志,进行恢复处理。

 

SQL Server使用锁来实施事务隔离属性。

锁是事务获取资源的一种控制资源,用于保护数据资源。放置其他事务对数据进行冲突或不兼容访问。

排他锁:当试图修改数据时,事务会为所依赖的数据资源请求排他锁。一旦授予,事务将一直持有排他锁,直至事务完成。

共享锁:当试图读取数据时,事务默认会为所依赖的数据资源请求共享锁,读操作一完成,就立即释放资源上的共享锁。这种模式下,多个事务可以同时持有同一资源上的共享锁。

事务之间的相互制约关系就是锁的兼容性。

用简单的话来总结一下事务之间锁的相互制约关系:如果数据正在由一个事务进行修改,其他事务就既不能修改也不能读取(至少默认不能)该数据,知道第一个事务完成。如果数据正由另一个事务读取,其他事务就不能修改该数据(至少默认不能),但可以读取。

可锁定资源的类型

SQL Server可以锁定不同类型或粒度的资源,这些资源类型包括Row ID或KEY(行),PAGE(页),对象(如表),数据库等。行位于页中,而页则是包含在表或索引数据的物理数据块。

为了获得特定资源类型上的锁,事务必须先在更高粒度级别上获得相同模式的意向锁。例如,为了获得某一行上的排他锁,事务必须现在那一行的页上获得意向排他锁,并在包含那一页的数据对象上获得意向排他锁。

意向锁的目的是为了在较高的粒度级别上有效检测不兼容的锁定要求,防止不兼容的锁。

SQL Server动态决定应该锁定哪种类型的资源。自然,为了获得良好的并发性,最好是只锁定需要的资源,即只锁定受影响的哪些行。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xc917563264/article/details/81352444
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:14:46
  • 阅读 ( 886 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢