数据库事物讲解
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。