数据库事务
通过将一组相关操作组合成一个要么全部执行成功,要么全部执行失败的单元,极大地简化了错误恢复并使应用程序更加可靠。事务既可以在存储过程中写,也可以在应用程序中写。
事物的三个操作:
开始,提交,回滚。
保存点:设置保存点后,事物回滚可以回滚到设置的保存点,而不必全部回滚。
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不支持读提交的隔离级别默认的隔离级别是重复读)
重复读:读的是第一次操作记录的版本
序列化(事务依次逐个执行,避免幻读)
这四个级别可以逐个解决脏读,不可重复读,幻读的问题。事务隔离的场景主要发生在事务并发的情况下。
脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。【事务提交前事务中的每个修改操作语句执行后数据库的值会变,不是提交后才变。事务的作用只是起一个将库中修改后的数据恢复原样的作用】
不可重复读:在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
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嵌套
可以不在事务中运行,有的话也会加入进去
不能在事务中运行,当前有事务则挂起改事务
不能在事务中运行,当前有事务则抛异常
必须在事务中运行,当前无事务则新建事务
必须在事务中运行,当前无事务则抛异常
必须在自己的事务中运行,挂起当前事务新建自己的事务,无当前事务则直接新建
嵌套在别的事务中独立运行。