概念
在许多大型、关键的应用程序中,计算机每秒钟都在执行大量的任务。更为经常的不是这些任务本身,而是将这些任务结合在一起完成一个业务要求,称为事务
。
事务是一个最小的工作单元,不论成功与否都作为一个整体进行工作。
ACID特性
当事务处理系统创建事务时,将确保事务有某些特性。组件的开发者们假设事务的特性应该是一些不需要他们亲自管理的特性。这些特性称为ACID特性。
ACID就是:
原子性(Atomicity )、一致性( Consistency )、隔离性( Isolation)和持久性(Durabilily)。
原子性
原子性属性用于标识事务是否完全地完成,一个事务的任何更新要在系统上完全完成。
如果由于某种原因出错,事务不能完成它的全部任务,系统将返回到事务未开始的状态。
一致性
事务在系统完整性中实施一致性,这通过保证系统的任何事务最后都处于有效状态来实现。
如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。
如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
因为事务开始时系统处于一致状态,所以现在系统仍然处于一致状态。
一致性是通过原子性来保证的。
隔离性
在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。
如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
隔离性不仅仅保证多个事务不能同时修改相同数据,而且能够保证事务操作产生的变化直到变化被提交或终止时才能对另一个事务可见,并发的事务彼此之间毫无影响。这就意味着所有要求修改或读取的数据已经被锁定在事务中,直到事务完成才能释放。
持久性
持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。持久性的概念允许开发者认为不管系统以后发生了什么变化,完成的事务是系统永久的部分。
事务隔离级别
常见事务异常名词
脏读:数据库的一个事务A正在使用一个数据但还没有提交,另外一个事务B也访问到了这个数据,还使用了这个数据,这就会导致事务B使用了事务A没有提交之前的数据。
不可重复读:在一个事务A中多次操作一个数据,在这两次或多次访问这个数据的中间,事务B也操作此数据,并使其值发生了改变,这就导致同一个事务A在两次操作这个数据的时候值不一样,这就是不可重复读。
幻读:一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变
隔离级别
从低到高分为以下四级:
-
Read uncommitted(读未提交):
写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务,可能会引发脏读 -
Read committed(读已提交):
读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。 -
Repeatable read(可重复读取):
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。 -
Serializable(串行化):
读加共享锁,写加排他锁。这样读取事务可以并发,但是读写事务之间都是互斥的,一个事务执行完,才执行下一个事务序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题
大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。
Mysql的默认隔离级别就是Repeatable read。
MySQL数据库事务处理
MySQL默认关闭事务。
事务处理涉及到三个最重要的命令:BEGIN, ROLLBACK, COMMIT,分别表示声明事务开始,回滚和确认提交。
操作 | 命令 |
---|---|
查询自动提交功能状态 | SELECT @@AUTOCOMMIT; |
设置自动提交功能 | SET AUTOCOMMIT=0或1; |
Oracle数据库事务处理
待更新
JDBC的事务支持
在JDBC中处理事务,都是通过Connection完成的。
同一事务中所有的操作,都在使用同一个Connection对象。JDBC事务 默认是开启的,并且是默认提交。
JDBC Connection 接口提供了两种事务模式:自动提交和手工提交。
JDBC中的事务,java.sql.Connection 的三个方法与事务有关:
setAutoCommit(boolean)
设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,需要手动提交事务。
commit()
提交结束事务。
rollback()
回滚结束事务
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155720.html