jdbc(2.2)

由于今天学的内容有点小多,就分开说了。
讲一下事务:
事务看名字就知道和事情有关系,这确实是和事情有直接关系,这是要我们去区分一些事情是应该同时去完成的还是可以分布完成的应该知识点。
如银行转账问题,由张三转给王五500块,如果将它分为2件事情,张三的钱减少500,王五的钱增加500的话,如果在张三的钱减少后网络出现了问题使得王五的钱还没有增加就终止的服务,那么这件事情就有问题了,但是如果我们把这件事情看作一件事,一起增减或者都不变化,这就是事务,事务的都不变化也称为回滚,返回到事务发生之前。
那么如何去完成这个操作呢,这就涉及到了connection的关闭了,如果在连接创建后将其关闭,那么数据就会提交给数据库,数据就真的是数据了,我们要在王五的事件结束后在去关闭connection,这样就可以避免事件的提交,但是connection又会自动取提交事件所以我们还要将connection的自动提交给关闭,这就完成的一个事务
代码如下:

public void testupdatething()  {
        Connection con = null;
        try {
            con = until.getconntion();
            //查看是否是自动提交
            System.out.println(con.getAutoCommit());
            //改变隔离级别为读提交的
            //con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            //吧con的自动提交关闭
            con.setAutoCommit(false);
            String sql = "update student set xh = xh + 10 where name = ?";
            update(con,sql,"zhangsan");
            //----------------------------------------------------
            //下面的语句是模拟异常
            //System.out.println(10 /0 );
            sql = "update student set xh = xh - 10 where name = ?";
            update(con,sql,"lisi");
            //提交数据
            con.commit();
            System.out.println("成功");
        } catch (Exception e) {
            e.printStackTrace();
            //出现异常就回滚数据
            try {
                con.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } finally {
            try {
                //重新把提交改为true
                con.setAutoCommit(true);
                //关闭con
                until.close(con,null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

这是工具类,去传入connection而不是自己去创建,在最后con不能关闭

 public void update(Connection con,String sql,Object ...args){
        PreparedStatement ps = null;
        try {
            ps = con.prepareStatement(sql);
            //for循环set ps
            for(int i = 0;i < args.length;i++){
                ps.setObject(i + 1,args[i]);
            }
            ps.execute();

			} catch (Exception e) {
		            e.printStackTrace();
		        } finally {
		            try {
		                until.close(null,ps);
		            } catch (Exception e) {
		                e.printStackTrace();
		            }
		        }
		    }

上述的就是事务流
说了事务流那还有一个相关的事务的ACID属性
1.原子性( Atomicity)
原子性是指事务是一一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.-致性 ( Consistency )
事务必须使数据库从一个一致性状态变换到另外- 一个一 致性状态。
3. 隔离性( Isolation )
事务的隔离性是指一个事务的执行不能被其他事务干扰,即-一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4.持久性( Durability )
持久性是指一一个事务一旦被提交 ,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
上面的就是ACID属性了

还有3种会出现的问题
脏读:对于两个事务T1, T2, T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚, T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2, T1读取了一一个字段,然后T2更新了该字段。之后, T1再次读取同-一个字段,值就不同了。
幻读:对于两个事务T1, T2,T1从一一个表中读取了一一个字段,然后T2在该表中插入了一些新的行。 之后,如果T1再次读取同一一个表,就会多出几行。

具体的就说一下隔离级别,隔离级别分为4种:

READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事物提交的变更脏读,不可重复读和幻读的问题都会出现
READ COMMITED(读已提交数据):只允许事务读取已经被其它事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现
REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物对这个字段进行更新.可以避免脏读和不可重复读,但幻读的问题仍然存在.
| SERIALIZABLE(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下.
它的并发性是随之下降的。
代码:

con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

这是改为二方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值