一:事务是什么
事务是针对数据库的一组操作(多条Sql命令执行),要么都成功,要么都失败。
二:事务的执行原理
默认情况下,我们向数据库提交的sql命令是自动提交的。开启事务本质上就是关闭自动提交功能,改为手动提交,只需要将提交事务的操作放在最后执行。这样一来,一旦在命令的执行过程中出现异常,由于没有提交事务,之前的操作就会被回滚掉。
三:多线程事务会引发的情况
1.脏读(dirty read):
读取到了另一个事务中未被提交的数据;
2.不可重复读(non-repeatable read):
在一个事务中两次的查询结果不一致,原因是因为另一个事务执行的update操作;
3.幻读/虚读(phantom read
):
在一个事务中两次查询的记录不一致,原因是另一个事务执行的insert和delete操作;
不可重读的与虚读的区别:
前者是在事务中两次查询到的记录的值不同
后者是在事务中两次查询到的记录的数量不同
四:事务的隔离级别
1.serializable:可串行化
能够避免脏读、幻读、不可重复读的情况发生,但是会引发线程堵塞
2.repeatable read:可重复读
能够避免脏读、不可重复读的情况的发生(mysql中此级别能够避免幻读情况)
3.read committed:读取已提交的内容
能够避免
4.read uncommitted:读取未提交的内容
没什么作用,但是会提升性能。
五:事务的特性
1.原子性
组成事务的一组sql命令形成了一个逻辑单元,不能只执行其中的一部分。
2.一致性
在事务处理前后,数据库的数据是一致的(数据库的数据完成行约束)。
3.隔离性
一个事务处理对另一个事务处理的影响。
4.持续性
事务处理的效果能够被永久保留下来
六:在JDBC中使用事务(Connection对象)
1.开启事务:
setAutoCommit(false);
2.提交事务:
commit();
3.回滚事务:
rollback();
4.设置事务的隔离级别:
setTransactionIsolationn(int level)
level:TRANSACTION_NONE
TRANSACTION_READ_CMMITTED
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE