1.事物四大属性:
1.原子性: 事务中的操作要么都发生,要么都不发生
2.一致性: 事务前后数据的完整性保持一致
3.隔离性: 一个事务不受其他事务的影响
4.持久性: 事务提交后,对数据库的改变是永久的
2. 数据库中事务 (默认一句sql语句就是一个事务)
start transaction 开启事务
commit 提交事务
rollback 回滚事物
在数据库中执行show variables like ‘%commit%’
结果为on 说明 开启了事物自动提交 off 关闭自动提交
可以通过 set autocommit = off(set autocommit=0) 关闭自动提交
3. jdbc 事务
connection.setAutoCommit(false); 关闭自动提交 手动开启事务
之后执行的sql语句需要提交才能对数据库进行永久性的改变
connection.commit(); 提交事务
connection.rollback(); 回滚事务
将事务中所有已执行但未提交的sql语句全部视为无效
这里通过转账的事件来分析一下: 转账分为 帐户扣钱 和帐户存钱 两部分
我们首先要从付款人的帐户扣钱 然后再到收款人的帐户存钱 加入在这个过程中
发生了未知的错误, 数据丢失那不仅付款人扣了钱收款人也收不到钱了? 我们需
要让扣钱和收钱这两个操作同时成功或同时失败,这就需要用到事务了.
//声明连接
Connection connection = null ;
try {
//获得连接对象
connection = DJUtils.getConnection();
//设置事物关闭自动提交 开启一个事物
connection.setAutoCommit(false);
//进行付款操作
Dao dao = new Dao();
dao.payMent(from, money);
//进行收款操作
dao.gathering(to, money);
//更改状态码
flag = true ;
//收付款完成 提交事物
connection.commit();
} catch (Exception e) {
e.printStackTrace();
System.out.println("收付款出错,进行回滚!!!");
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
System.out.println("事物回滚失败!!!");
}
} finally {
try {
//打开事物自动提交
connection.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("打开事物自动提交错误!!!");
}
}
4.如果不考虑隔离性会引发的问题
(1)脏读: 一个事务读取了另一个事务未提交的数据(无效数据读出)
我的理解是,我借1000块给别人,开启了一个事务但还没提交,然后他上支付宝
一看,钱已经到账了,然后我回滚事物,他再次打开支付宝,钱没了. 感觉自己又赚了两 千 .
(2)不可重复读: 一个事务中, 多次查询结果不一致(主要是update操作)
就像我往银行存1000块,银行查账是屏幕显示的是1000块,然后这个时候,我又
把它取出来了并提交了,银行这时将数据写到文件中,变成0了,这样显示数据和写入
数据不一致.这就不知道以哪个数据为标准了,感觉很懵逼.
(3)虚读(幻读): 在一个事务内读取到别的事务插入的数据, 导致前后读取不一致
系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系 统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。
虚读和幻读感觉含义很相近,不是很好区分,经过查找,我感觉下面这种解释比较好理解一点
他们大致的区别在于不可重复读是由于另一个事务对数据的更改所造成的,而幻读是由于另一个事务插入或删除引起的
5.四种隔离级别
Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
Read committed:可避免脏读情况发生(读已提交)
Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
数据库中设置事务隔离级别
set session transaction isolation level 隔离级别
数据库中查询事务隔离级别
select @@tx_isolation
隔离级别:Serializable>repeatable read > read committed > read uncommitted
效率:Serializable