数据库事务
2012-08-27 10:13
141 查看
一.数据库的事务应当具有以下四种特性:
Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
Consistency(一致性):数据不会因为事务的执行而遭受破坏.只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
实现:DBMS的完整性子系统执行测试任务
{
`完整性约束:域约束,基本表约束和断言
}
Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。
事务的隔离性一般由事务的锁来进行控制。
实现:DBMS的并发控制子系统
{
1.丢失更新问题
2.读脏数据
3.不可重复读问题
}
Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。
实现:恢复管理子系统
二.事务的隔离性
1.选择完隔离级别后,常遇到以下几种情况:
1.更新丢失(Lost update):两个事务同时更新,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。
2.脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
3.不可重复读取(Non-repeatable Reads):一个事务两次读取,但在第二次读取前另一事务已经更新了。
4.虚读(Phantom Reads):一个事务两次读取,第二次读取到了另一事务插入的数据。
5.两次更新问题(Second lost updates problem):两个事务都读取了数据,并同时更新,第一个事务更新失败。
2.隔离级别(低->高)
● Read Uncommitted
允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● Read Committed
允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read)
禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable)
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
之间关系
3.隔离级别的选择
对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
4.SQL语句可以使用SET TRANSACTION ISOLATION LEVEL来设置事务的隔离级别。
设置事务级别:SET TRANSACTION ISOLATION LEVEL Read Committed。
开始事务:begin tran
提交事务:COMMIT
回滚事务:ROLLBACK
创建事务保存点:SAVE TRANSACTION savepoint_name
回滚到事务点:ROLLBACK TRANSACTION savepoint_name
5.锁(并发控制的手段)
独占锁(排他锁):只允许一个事务访问数据
共享锁:允许其他事务继续使用锁定的资源
更新锁
锁就是保护指定的资源,不被其他事务操作,锁定的资源包括行、页、簇、表和数据库。为了最小化锁的成本,SQL Server自动地以与任务相应等级的锁来锁定资源对象。锁定比较小的对象,例如锁定行,虽然可以提高并发性,但是却有较高的开支,因为如果锁定许多行,那么需要占有更多的锁。锁定比较大的对象,例如锁定表,会大大降低并发性,因为锁定整个表就限制了其他事务访问该表的其他部分,但是成本开支比较低,因为只需维护比较少的锁。
Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
Consistency(一致性):数据不会因为事务的执行而遭受破坏.只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
实现:DBMS的完整性子系统执行测试任务
{
`完整性约束:域约束,基本表约束和断言
}
Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。
事务的隔离性一般由事务的锁来进行控制。
实现:DBMS的并发控制子系统
{
1.丢失更新问题
2.读脏数据
3.不可重复读问题
}
Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。
实现:恢复管理子系统
二.事务的隔离性
1.选择完隔离级别后,常遇到以下几种情况:
1.更新丢失(Lost update):两个事务同时更新,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。
2.脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
3.不可重复读取(Non-repeatable Reads):一个事务两次读取,但在第二次读取前另一事务已经更新了。
4.虚读(Phantom Reads):一个事务两次读取,第二次读取到了另一事务插入的数据。
5.两次更新问题(Second lost updates problem):两个事务都读取了数据,并同时更新,第一个事务更新失败。
2.隔离级别(低->高)
● Read Uncommitted
允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● Read Committed
允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read)
禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable)
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
之间关系
3.隔离级别的选择
对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
4.SQL语句可以使用SET TRANSACTION ISOLATION LEVEL来设置事务的隔离级别。
设置事务级别:SET TRANSACTION ISOLATION LEVEL Read Committed。
开始事务:begin tran
提交事务:COMMIT
回滚事务:ROLLBACK
创建事务保存点:SAVE TRANSACTION savepoint_name
回滚到事务点:ROLLBACK TRANSACTION savepoint_name
5.锁(并发控制的手段)
独占锁(排他锁):只允许一个事务访问数据
共享锁:允许其他事务继续使用锁定的资源
更新锁
锁就是保护指定的资源,不被其他事务操作,锁定的资源包括行、页、簇、表和数据库。为了最小化锁的成本,SQL Server自动地以与任务相应等级的锁来锁定资源对象。锁定比较小的对象,例如锁定行,虽然可以提高并发性,但是却有较高的开支,因为如果锁定许多行,那么需要占有更多的锁。锁定比较大的对象,例如锁定表,会大大降低并发性,因为锁定整个表就限制了其他事务访问该表的其他部分,但是成本开支比较低,因为只需维护比较少的锁。
相关文章推荐
- 数据库事务初探
- 数据库事务和锁
- SQL基础-->数据库事务(TRANSACTION)
- C#数据库事务原理及实践
- 数据库事务管理详细讲解
- 数据库事务
- 数据库事务的隔离级别
- 数据库事务隔离
- 数据库事务
- 数据库事务
- 数据库事务总结 基本特征 并发问题 隔离级别(几个文章的综合,下面有链接)
- 数据库事务并发可能出现的问题——事务的隔离机制和乐观、悲观锁
- 数据库事务的四大特性以及事务的隔离级别
- 数据库事务系列-事务模型基础
- spring中的两个数据库事务DataSourceTransactionManager 和 JtaTransactionManager区别
- 【Laravel】数据库事务
- 数据库事务的特性和隔离级别
- 在 .NET 中使用 Oracle 数据库事务 作者:Jason Price 转自oracle.com
- 数据库事务
- SQL基础-->数据库事务(TRANSACTION)