事务+事务的四大特性+隔离性的具体分析+数据库连接池
一、事务
1.事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成。参考转账操作。
2.如果你自己不去控制事务,数据库默认一条sql语句就处在自己单独的事务当中。
3.也可以使用命令去开启一个事务:
start transaction;--开启事务,这条语句之后的sql语句将处在一个事务当中,这些sql语句并不会立即执行
Commit--提交事务,一旦提交事务,事务中的所有sql语句才会执行。
Rollback -- 回滚事务,将之前所有的sql取消。
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
conn.setSavePoint();
conn.rollback(sp);
4.事务的四大特性ACID
~原子性:事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。
~一致性: 事务在执行前后数据的完整性保持不变。数据库在某个状态下符合所有的完整性约束的状态叫做数据库具有完整性。在解散一个部门时应该同时处理员工表中的员工保证这个事务结束后,仍然保证所有的员工能找到对应的部门,满足外键约束。
~隔离性:当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。
~持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,不能再回滚。
5.事务的隔离性导致的问题(所有的问题都是在某些情况下才会导致问题)
~脏读:一个事务读取到了另一个事务未提交的数据。
1 | a | 1000
2 | b | 1000
b--->a
start transaction;
update account set money=money-100 where name='b';
update account set money=money+100 where name='a';
rollback;
select * from account where name = 'a';1000 1000
~不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同.
start transaction:
活期存款:1000
定期存款:1000
固定资产: 2000
--------------
开启事务
取走获取存款1000
提交事务
--------------
总资产:3000
~幻读(虚读):一个事务读取到了另一个事务插入的数据(已提交)
a 2000
b 2000
c 2000
start transaction;
select sum(money) from account;6000
--------------
开启事务
创建一个账户并存入1000块钱
提交了事务
--------------
select count(*)from account;4
avgMoney = allMoney/count;6000/4=1500
6.数据库的隔离级别
~Read uncommitted:如果将数据库设定为此隔离级别,数据库将会有脏读、不可重复度、幻读的问题。
~Read committed:如果将数据库设定为此隔离级别,数据库可以防止脏读,但有不可重复度、幻读的问题。
~Repeatable read: 如果将数据库设定为此隔离级别,数据库可以防止脏读、不可重复度,但是不能防止幻读。
~Serializable:将数据库串行化,可以避免脏读、不可