事务
2016-06-23 09:49
190 查看
定义:事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
特性(ACID特性):
1.原子性:一个事务是一个不可分隔的基本单位,事务中包括的操作,要么都做,要么都不做;
2.一致性:事务必须是数据库从一个一致性变到另一个一致性。也就是说事务中对数据库的操作只可能有两种结果:成功和失败;
3.隔离性:一个事务的执行不被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;
4.持久性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响;
---------------------------------------------------------------------------------------------------------
因为并发访问的存在,在数据库的操作中就可能出现一下情况:
包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
为了避免以上问题的出现,定义事务隔离级别:
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
特性(ACID特性):
1.原子性:一个事务是一个不可分隔的基本单位,事务中包括的操作,要么都做,要么都不做;
2.一致性:事务必须是数据库从一个一致性变到另一个一致性。也就是说事务中对数据库的操作只可能有两种结果:成功和失败;
3.隔离性:一个事务的执行不被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;
4.持久性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响;
---------------------------------------------------------------------------------------------------------
因为并发访问的存在,在数据库的操作中就可能出现一下情况:
更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。脏读
一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。不可重复读
不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
为了避免以上问题的出现,定义事务隔离级别:
未授权读取
也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。授权读取
也称为读已提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。可重复读取(Repeatable Read)
可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。序列化(Serializable)
序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
相关文章推荐
- ubuntu下java调用c++动态库
- Java保证程序结束时调用释放资源函数
- 【转】Autowired和resource注解的区别(来源于公司同事分享)
- Java设计模式——起章
- UIView设置指定角为圆角的代码
- Oracle 11g 安装与卸载图解
- 应用Druid监控SQL语句的执行情况
- 个人作业五:四则运算二
- matlab调用Java程序时出现 Java.lang.OutOfMemoryErrot: GC overhead limit exceeded
- Android使用最小宽度限定符时最小宽度的计算
- 锁
- wince下获取mac地址的简单方法!
- android 之断点续传详解三部曲之[三] → 多任务同时下载
- 提升Android应用视觉效果的10个UI技巧
- Android高级篇-NDK(Native Development Kit)之坏境搭建【一】
- Eclipse SVN (Subclipse的更新日志)、版本集合(1.10.0起)、更新、安装方法!
- android 之断点续传详解三部曲之[一] → 多任务下载
- java Math
- WebP官方翻译==Google推出新的图片格式WebP
- Eclipse图文详解安装SVN(Subclipse)插件方法,教程!