数据库事务

Posted speak out now.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务相关的知识,希望对你有一定的参考价值。

                                                                          数据库事务

通过将一组相关操作组合成一个要么全部执行成功,要么全部执行失败的单元,极大地简化了错误恢复并使应用程序更加可靠。事务既可以在存储过程中写,也可以在应用程序中写。

事物的三个操作:

开始,提交,回滚。

保存点:设置保存点后,事物回滚可以回滚到设置的保存点,而不必全部回滚。

   

java事务的类型有三种;JDBC事务,JTA事务(分布式多数据源),容器事务。

在jdbc api中,默认的情况为自动提交事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用commit()来提交,否则将调用rollback()来撤消事务。 
在jdbc api中,可以通过调用setAutoCommit(false) 来禁止自动提交事务。然后就可以把多条更新数据库的sql语句做为一个事务,在所有操作完成之后,调用commit()来进行整体提交。倘若其中一项 sql操作失败,就不会执行commit()方法,而是产生相应的sqlexception,此时就可以捕获异常代码块中调用rollback()方法撤消事务。

 

                                                                          存储过程

存储过程是大型数据库系统中一组为了完成特定功能的SQL语句集,存储在数据库中。经过第一次编译后再次调用不用再编译。用户通过指定存储过程的名字并给出参数(如果该存储过程有名字)来执行它。

 

 

                                                                     数据库事务隔离级别

http://blog.csdn.net/fg2006/article/details/6937413

数据库事务的隔离级别有四个:

由低到高依次为

读未提交(可读其他事务已修改但未提交的数据,产生脏读)

读提交(只能读其他事务提交后的数据,避免脏读。大多数据库默认的隔离级别,mysql由于语句级的binlog不支持读提交的隔离级别默认的隔离级别是重复读)

重复读:读的是第一次操作记录的版本

序列化(事务依次逐个执行,避免幻读)

这四个级别可以逐个解决脏读,不可重复读,幻读的问题。事务隔离的场景主要发生在事务并发的情况下。

脏读:

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。【事务提交前事务中的每个修改操作语句执行后数据库的值会变,不是提交后才变。事务的作用只是起一个将库中修改后的数据恢复原样的作用】

不可重复读:在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

这是由于一个事务的两次查询之间其他事务修改数据并提交而引起的。比如事务T1读取某一数据后,事务T2读取并修改了该数据并提交了,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
幻读:
同不可重复读一样,唯一的区别是修改数据的事务中修改要为增加/删除记录。
三种情况的区别:
脏读和不可重度读(及幻读)的区别是两个事务的交叉点不一样。后者的两次读将修改操作事务完全包围。前者是两个事务的开头和结尾互相交叉。而不可重复读和幻读的区别是修改事务的修改操作的区别,一个为修改记录值,一个为删除或添加记录行。
 

set 作用域 transaction isolation level 事务隔离级别,例如~

mysql> set global transaction isolation level read committed; //全局的

mysql> set session transaction isolation level read committed; //当前会话

 

http://www.cnblogs.com/aliger/p/3898869.html

 

spring事务传播行为:

1221嵌套

可以不在事务中运行,有的话也会加入进去

不能在事务中运行,当前有事务则挂起改事务

不能在事务中运行,当前有事务则抛异常

必须在事务中运行,当前无事务则新建事务

必须在事务中运行,当前无事务则抛异常

必须在自己的事务中运行,挂起当前事务新建自己的事务,无当前事务则直接新建

嵌套在别的事务中独立运行。

 

以上是关于数据库事务的主要内容,如果未能解决你的问题,请参考以下文章

事务日志的用途是啥

数据库事务初识

事务分类与特性

事务特性,事务的隔离级别,并发事务可能出现的问题,spring事务 数据库锁

数据库事务系列5 分布式事务及其他

SQLServer事务java事务