数据库事务

来源:互联网 发布:设计服装的软件 编辑:程序博客网 时间:2024/06/03 22:39

 

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

 

 

数据库事务:

数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行

Acid属性:

原子性(Atomic:一组sql语句,要么都执行,要么都不执行。如果只执行这里的几个sql,就有可能破坏事务的总体目标,例如银行转账,转出去之后停电了,收款人没拿到钱,就这破坏了事务的目标,转账。

一致性(Consistent:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性(Isolation)一个事务的执行不能被其他事务干扰。

持续性/永久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

事务的三种模式:

1..隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的

标记。

2.显式事务是指有显式的开始和结束标记的事务,每个事务都有显式的开始和结束标记。

3.自动事务是系统自动默认的,开始和结束不用标记。

隔离级别:

Read Uncommitted

直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别

的事务可以读到这个改变.这是很不安全的.

Read Committed

直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后

别的事务就能读到这个改变.

Repeatable Read

直译就是"可以重复读",这是说在同一个事务里面先后执行同一个

查询语句的时候,得到的结果是一样的.

Serializable:

是最高级别的隔离级,它通过强制事务排序,使之不可能相互冲突,从而解决幻读的问题。简言之,SERIALIZABLE是在每个读的数据行上加锁,可能导致大量的超时(Time out)现象和锁竞争。很少选择这种隔离级别。

直译就是"序列化",意思是说这个事务执行的时候不允许别的事务

并发执行.

MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

 

发生的问题:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

  不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

   幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

 

0 0
原创粉丝点击