不知道大家对事务了解多少?如果大家使用过数据库,使用过sql进行过查询语句的编写,那么对事务应该也有所耳闻吧,接下来就给大家讲解一下事务的相关内容(如果大家对数据库的相关概念还不是很熟悉的话,可以在后台留言,抽空阿Q会将其进行整理,一并分享给大家)。
首先是事务的概念:一件事情由n个组成单元,这n个组成单元要么同时成功,要么同时失败,这就是将n个组成单元放到一个事务中了。举个简单的例子:在不考虑试题正确与否的前提下,一张试卷由多个题目构成,当你答完题交给老师的时候是将一整张试卷交给老师,而不是将每道题单独交给老师,在这里试卷就可以理解成一个事务。
事务的操作一般分为开启事务、事务提交和事务回滚。让我们看一下平时见到的事务都有哪些。
mysql中的事务1)显示的开启一个事务:start transaction2)事务提交:commit代表从开启事务到事务提交中间的所有的sql都认为有效,真正的更新数据3)事务的回滚:rollback 从开启事务到事务回滚中间的所有的sql操作都认为无效数据,没有被更新
JDBC事务操作开启事务:conn.setAutoCommit(false);提交事务:conn.commit();回滚事务:conn.rollback();注意:执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制
DBUtils事务操作无参构造可以开启事务:QueryRunner runner = new QueryRunner();无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使用QueryRunner对象操作数据库时要使用有Connection参数的方法runner.update(conn,sql);
接下来就介绍一下事务的特性(ACID),这四个特性一般在面试题中会被问到,需要记忆一下:
1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作,要么都发生,要么都不发生;
eg:拿购物来说吧,假设你在购物车里添加了两件衣服:鞋子+裤子,当你把两件衣服作为一个订单提交支付的时候,要么两件衣服一起支付成功,要么都失败,不可能存在衣服付完钱了,鞋子还没付完的情况,反之亦然。
2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致;
eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是20000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是20000,这就是事务的一致性。
3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离;
eg:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
eg: 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
在许多事务处理同一个数据时,如果没有采取有效的隔离机制,那么并发处理数据时,会带来一些的问题。
隔离性引发并发问题1)脏读:B事务读取到了A事务尚未提交的数据;2)不可重复读:一个事务中两次读取的数据的内容不一致;3)幻读/虚读:一个事务中两次读取的数据的数量不一致;
事务的隔离级别1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的3)repeatable read:重读读取:可以解决脏读和不可重复读 ---mysql默认的4)serializable:串行化:可以解决脏读、不可重复读和虚读---相当于锁表(如有疑问想提前了解锁表机制,可以提问哟)
查看mysql数据库默认的隔离级别:select @@tx_isolation
设置mysql的隔离级别
例子:设置事务隔离级别+读未提交set session transaction isolation level read uncommitted;