1.ACID
ACID是数据库执行的四大特性即,原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
1.1 原子性
原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。如果在事务发生的中途发生错误,需要执行回滚操作取消事务之前执行的结果。
1.2 一致性
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
1.2.1 数据库机制层面
数据库层面的一致性是,在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置.这一点是由SQL SERVER进行保证的.
1.2.2 业务层面
对于业务层面来说,一致性是保持业务的一致性.这个业务一致性需要由开发人员进行保证.很多业务方面的一致性可以通过转移到数据库机制层面进行保证.例如:经典的A转账给B200元钱,我们就可以通过规定A-200和B+200为一个事务保证转账业务的一致性。
1.3 隔离性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。而此时我们就不得不提到事务并发执行是不得不遇到的问题:
(1) 脏读,事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
(2) 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
(3) 幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
(4) 第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了。
(5) 第二类丢失更新:不可重复读的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。
为此数据库设置了四个事务隔离等级,来解决不同的并发问题:
READ_UNCOMMITTED(读未提交),事务中的修改,即使没有提交,在其他事务也都是可见的。该级别只能解决第一类丢失更新问题。
READ_COMMITTED(读已提交),保证一个事务修改的数据提交后才能被另外一个事务读取,即另外一个事务不能读取该事务未提交的数据。(大多数数据库的默认级别,如sql Server,Oracle等)该级别隔离等级可以解决第一类丢失更新和脏读问题。
REPEATABLE_READ(可重复读),保证一个事务相同条件下前后两次获取的数据是一致的。(mysql常用的)该隔离级别可以解决第一类丢失更新,脏读,不可重复读,第二类丢失更新的问题。
SERIALIZABLE(可串行化),最高的隔离级别,强制事务串行执行。可解决上诉所提到的所有问题。
mysql隔离等级操作: 1.查询当前会话隔离等级:SELECT @@tx_isolation;
2.查询系统当前的隔离等级:SELECT @@global.tx_isolation;
3.设置当前会话隔离等级:SET session transaction isolation level + 隔离等级;
4.设置系统当前隔离等级:SET global transaction isolation level + 隔离等级;
1.4 持久性
事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中。
持续更新。。。。。。。。。
原文地址:https://www.cnblogs.com/WhiskeyLover/p/9531834.html