德宏企业建站-400电话办理-网站建设【企业网站制作|网页设计】- 高端网站建设 - 书生商友信息科技-

全国热线:400-111-6878

网站建设推广专家

德宏企业建站

发表日期: 2022-11-30 12:28:46 浏览次数:69

德宏企业建站

网站建设.png


这张区块链电子发票又一次引起了人们对于区块链技术的兴趣,腾讯区块链业务总经理蔡弋戈表示,对于区块链的应用应该更注重于实际应用,未来区块链的落地会以场景为主。


此次,区块链电子发票具有全流程的完整追溯、信息不可篡改等特性,与发票逻辑吻合,并且可以完善发票的监管流程,可以使涉费信息更加安全。将区块链技术使用于电子发票中,可以很大程度上解决传统发票流转周期长、存在被篡改和发票造假、偷税漏税等行为。



考虑一个实现在两个账户间进行转账的函数:

CREATE FUNCTION transfer_funds() RETURNS void AS $$
try:
    plpy.execute("UPDATE accounts SET balance = balance - 100 WHERE account_name = 'joe'")
    plpy.execute("UPDATE accounts SET balance = balance + 100 WHERE account_name = 'mary'")
except plpy.SPIError, e:
    result = "error transferring funds: %s" % e.args
else:
    result = "funds transferred correctly"
plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"])
plpy.execute(plan, [result])
$$ LANGUAGE plpythonu;

如果第二个UPDATE语句导致产生一个异常,这个函数将会报告该错误,但是第一个UPDATE的结果却不会被提交。换句话说,资金将从 Joe 的账户中收回,而不会转移到 Mary 的账户中。

为了避免这类问题,可以把plpy.execute包裹在显式子事务中。plpy模块提供了一种助手对象来管理用plpy.subtransaction()函数创建的显式子事务。这个函数创建的对象实现了上下文管理器接口。通过使用显式子事务,我们可以把函数写成:

CREATE FUNCTION transfer_funds2() RETURNS void AS $$
try:
    with plpy.subtransaction():
        plpy.execute("UPDATE accounts SET balance = balance - 100 WHERE account_name = 'joe'")
        plpy.execute("UPDATE accounts SET balance = balance + 100 WHERE account_name = 'mary'")
except plpy.SPIError, e:
    result = "error transferring funds: %s" % e.args
else:
    result = "funds transferred correctly"
plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"])
plpy.execute(plan, [result])
$$ LANGUAGE plpythonu;

注意仍需使用try/catch。否则异常会传播到 Python 栈的顶层并且将导致整个函数以一个PostgreSQL错误中止,这样不会有任何行被插入到operations表。子事务上下文管理器不会捕捉错误,它只确保在其范围内执行的所有数据库操作将被原子性地提交或者回滚。在任何类型的异常(并非只是数据库访问产生的错误)退出时,会发生子事务块回滚。在显式子事务块内部产生的常规 Python 异常也会导致子事务被回滚。







德宏企业建站

上一条:德宏网络推广公司-德宏百度营销推广
下一条:昭通58同城推广电话
网站制作
小程序制作
网站优化
网站开发
400电话办理
网络推广
网站建设
网店装修
微信公众号开发
网页设计
网络公司
域名企业邮箱
服务器空间
网站案例报价
百科问答
编辑排版美工
App软件开发
百度推广
代运营托管
logo设计
网络全网营销
网站备案
网站定制
小程序开发公司
首页
电话
立即预约