数据库事物讲解

1.一组操作,要么全部成功,要么全部失败。

2.数据库默认事物是自动提交的,即发一条sql就执行一句,如果想让多条sql放在一个事物中,需要手动开启事物和提交事物

start transaction :开启事务

  • rollback:回滚事务
  • commit:提交事务

3.事物是数据库提供的属性,在java代码中,通过connection开启,提交或回滚事物。操作的都是数据库中的事物属性。

4.当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列的JDBC控制事务语句:

  • Connection.setAutoCommit(false); //开启事务(start transaction)
  • Connection.rollback(); //回滚事务(rollback)
  • Connection.commit(); //提交事务(commit)

5.事物的四大特性:

原子性:不可分割,要么全部成功,要么全部失败

一致性:以转账为例,转出去的钱和收到的钱必须是一样的

持久性:

隔离性:根据两个事物之间的相互影响程度,分为不同的隔离级别,不同的级别,两个事物之间的影响程度也不同。

多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

6.隔离级别带来的问题:

脏读:对应的隔离级别是读未提交。即一个事物里操作了数据,但还没有提交,另一个事物就可以读取操作后的数据了。容易造成套现现象

不可重复读:一个事物在读取某一行数据时,多次读取的结果不同(读取了别的事物已经提交的数据)。如果想实时读取更新的数据,那么不可重复读就不是一个存在的问题,如果不想实时的读取更新数据,那么不可重复读就是一个问题。在此需要注意的是,在一次事物中重复的读取某一条数据,而数据在不断变化。隔离级别设置成可重复读可以解决此问题。

举例:比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

虚读(幻读):一个事物在查询某个范围段的数据时,多次读取的数据条数不一致。造成原因是另一个事物在这个范围段内插入了数据,所以多了记录条数。不可重复读是一条数据的不可重复读,虚读是一个范围段内的数据多了记录条数。隔离级别调到串行化可以解决此问题。

隔离级别:读未提交,读已提交,可重复读,串行化

7.MySQL默认的隔离级别为REPEATABLE-READ,并且是严格遵循数据库规范设计的,即支持4种隔离级别;Oracle默认的隔离级别为Read committed,并且不支持这4种隔离级别,只支持这4种隔离级别中的2种,Read committed和Serializable

posted @ 2018-03-26 10:01  架构改变世界  阅读(208)  评论(0编辑  收藏  举报