JDBC 事务

MySQL 事务看这里:

MySQL事务

JDBC 事务_第1张图片

举个栗子:

JDBC 事务_第2张图片

表里两个账户,余额分别为 1000 块钱:

现在 Robin 准备给 Camilla 转 500 块钱,那么此时得同时更新两个账户的余额 balance。

JDBC 事务_第3张图片
JDBC 事务_第4张图片

转账成功,余额发生变化:

JDBC 事务_第5张图片

突然,Robin 在转账过程中出现意外情况(先初始化双方余额到 1000):

JDBC 事务_第6张图片
JDBC 事务_第7张图片

在这里抛出了异常,转账终止,再查询下余额:

JDBC 事务_第8张图片

这就违反了事务的一致性,所以应该对整个转账流程做事务的处理,才能保证事务的特性,当转账成功时,事务直接提交给 MySQL,而如果转账失败或者被中断,则回滚到最初的状态。

JDBC 事务_第9张图片

现在对 SQL 的操作方法都是重新获取一个连接,如果要做事务处理,得保证在同一个连接下,那么需要对方法做下修改:

JDBC 事务_第10张图片

Connection 由外部进行处理,并传参,这样可以保证在同一个连接做好事务处理:

JDBC 事务_第11张图片
JDBC 事务_第12张图片

事务的隔离级别:

还是看这里 MySQL事务

JDBC 事务_第13张图片

初始化表记录:

设置读取记录的隔离级别为 TRANSACTION_READ_UNCOMMITTED:

JDBC 事务_第14张图片

先查询下 Robin 的余额:

JDBC 事务_第15张图片
JDBC 事务_第16张图片

执行以下更新操作,然鹅并不提交事务:


JDBC 事务_第17张图片

执行成功,余额已变为 500,其实数据表的记录还是 1000,说明隔离级别起作用了。但是这样的结果是不想看到的,毕竟多个事务之间并发执行的话,会造成读取记录的各种问题,所以应该选择合适的隔离级别。其他隔离级别,各位看官可以试试。

JDBC 事务_第18张图片

最好的方式是在命令行里面去设置隔离级别,如果需要经常切换数据库,而且在数据库的隔离级别未知的情况下,在代码里面设置就很方便了,你觉得呢?

嘿嘿~

JDBC 事务_第19张图片



以上为本人的一些学习笔记,如有出错欢迎指正,陆续更新!!!

你可能感兴趣的:(JDBC 事务)