pdf page to image c# itextsharp : Add text field pdf SDK control project winforms web page html UWP apis-php-en44-part1437

Global transaction IDs
Idea and client-side emulation
PECL/mysqlnd_ms can do client-side transparent global transaction ID injection. In its most basic form, a
global transaction identifier is a counter which is incremented for every transaction executed on the master.
The counter is held in a table on the master. Slaves replicate the counter table.
In case of a master failure a database administrator can easily identify the most recent slave for promoting
it as a new master. The most recent slave has the highest transaction identifier.
Application developers can ask the plugin for the global transaction identifier (GTID) for their last
successful write operation. The plugin will return an identifier that refers to an transaction no older than that
of the clients last write operation. Then, the GTID can be passed as a parameter to the quality of service
(QoS) filter as an option for session consistency. Session consistency ensures read your writes. The filter
ensures that all reads are either directed to a master or a slave which has replicated the write referenced
by the GTID.
When injection is done
The plugin transparently maintains the GTID table on the master. In autocommit mode the plugin injects
an UPDATE statement before executing the users statement for every master use. In manual transaction
mode, the injection is done before the application calls commit() to close a transaction. The configuration
option report_error of the GTID section in the plugins configuration file is used to control whether a
failed injection shall abort the current operation or be ignored silently (default).
Please note, the PHP version requirements for transaction boundary monitoring and their limits.
Client-side global transaction ID injection has shortcomings. The potential issues are not specific to PECL/
mysqlnd_ms but are rather of general nature.
• Global transaction ID tables must be deployed on all masters and replicas.
• The GTID can have holes. Only PHP clients using the plugin will maintain the table. Other clients will not.
• Client-side transaction boundary detection is based on API calls only.
• Client-side transaction boundary detection does not take implicit commit into account. Some MySQL
SQL statements cause an implicit commit and cannot be rolled back.
Using server-side global transaction identifier
Starting with PECL/mysqlnd_ms 1.3.0-alpha the MySQL 5.6.5-m8 or newer built-in global transaction
identifier feature is supported. Use of the server feature lifts all of the above listed limitations. Please, see
the MySQL Reference Manual for limitations and preconditions for using server built-in global transaction
Whether to use the client-side emulation or the server built-in functionality is a question not directly related
to the plugin, thus it is not discussed in depth. There are no plans to remove the client-side emulation and
you can continue to use it, if the server-side solution is no option. This may be the case in heterogenous
environments with old MySQL server or, if any of the server-side solution limitations is not acceptable.
From an applications perspective there is hardly a difference in using one or the other approach. The
following properties differ.
• Client-side emulation, as shown in the manual, is using an easy to compare sequence number for global
transactions. Multi-master is not handled to keep the manual examples easy.
Add text field pdf - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
chrome pdf save form data; add fillable fields to pdf online
Add text field pdf - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
pdf form creation; best way to create pdf forms
Cache integration
Server-side built-in feature is using a combination of a server identifier and a sequence number as a
global transaction identifier. Comparison cannot use numeric algebra. Instead a SQL function must be
used. Please, see the MySQL Reference Manual for details.
Server-side built-in feature of MySQL 5.6 cannot be used to ensure session consistency under all
circumstances. Do not use it for the quality-of-service feature. Here is a simple example why it will
not give reliable results. There are more edge cases that cannot be covered with limited functionality
exported by the server. Currently, clients can ask a MySQL replication master for a list of all executed
global transaction IDs only. If a slave is configured not to replicate all transactions, for example, because
replication filters are set, then the slave will never show the same set of executed global transaction
IDs. Albeit the slave may have replicated a clients writes and it may be a candidate for a consistent
read, it will never be considered by the plugin. Upon write the plugin learns from the master that the
servers complete transaction history consists of GTID=1..3. There is no way for the plugin to ask for the
GTID of the write transaction itself, say GTID=3. Assume that a slave does not replicate the transactions
GTID=1..2 but only GTID=3 because of a replication feature. Then, the slaves transaction history is
GTID=3. However, the plugin tries to find a node which has a transaction history of GITD=1...3. Albeit
the slave has replicated the clients write and session consistency may be achieved when reading from
the slave, it will not be considered by the plugin. This is not a fault of the plugin implementation but a
feature gap on the server side. Please note, this is a trivial case to illustrate the issue there are other
issues. In sum you are asked not to attempt using MySQL 5.6 built-in GTIDs for enforcing session
consistency. Sooner or later the load balancing will stop working properly and the plugin will direct all
session consistency requests to the master.
• Plugin global transaction ID statistics are only available with client-side emulation because they monitor
the emulation.
Global transaction identifiers in distributed systems
Global transaction identifiers can serve multiple purposes in the context of
distributed systems, such as a database cluster. Global transaction identifiers
can be used for, for example, system wide identification of transactions, global
ordering of transactions, heartbeat mechanism and for checking the replication
status of replicas. PECL/mysqlnd_ms, a clientside driver based software, does
focus on using GTIDs for tasks that can be handled at the client, such as checking
the replication status of replicas for asynchronous replication setups.
7.5.12 Cache integration
Copyright 1997-2014 the PHP Documentation Group.
Version requirement
The feature requires use of PECL/mysqlnd_ms 1.3.0-beta or later, and PECL/
mysqlnd_qc 1.1.0-alpha or newer. PECL/mysqlnd_ms must be compiled to
support the feature. PHP 5.4.0 or newer is required.
Setup: extension load order
PECL/mysqlnd_ms must be loaded before PECL/mysqlnd_qc, when using
shared extensions.
Feature stability
The cache integration is of beta quality.
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Insert images into PDF form field. Access to freeware download and online C#.NET class source code. How to insert and add image, picture, digital photo, scanned
chrome save pdf form; change font size pdf form reader
VB.NET PDF insert image library: insert images into PDF in vb.net
Insert images into PDF form field in VB.NET. with this sample VB.NET code to add an image PDFDocument = New PDFDocument(inputFilePath) ' Get a text manager from
add signature field to pdf; create a fillable pdf form online
Cache integration
Suitable MySQL clusters
The feature is targeted for use with MySQL Replication (primary copy). Currently,
no other kinds of MySQL clusters are supported. Users of such cluster must control
PECL/mysqlnd_qc manually if they are interested in client-side query caching.
Support for MySQL replication clusters (asynchronous primary copy) is the main focus of PECL/
mysqlnd_ms. The slaves of a MySQL replication cluster may or may not reflect the latest updates from
the master. Slaves are asynchronous and can lag behind the master. A read from a slave is eventual
consistent from a cluster-wide perspective.
The same level of consistency is offered by a local cache using time-to-live (TTL) invalidation strategy.
Current data or stale data may be served. Eventually, data searched for in the cache is not available and
the source of the cache needs to be accessed.
Given that both a MySQL Replication slave (asynchronous secondary) and a local TTL-driven cache
deliver the same level of service it is possible to transparently replace a remote database access with a
local cache access to gain better possibility.
As of PECL/mysqlnd_ms 1.3.0-beta the plugin is capable of transparently controlling PECL/mysqlnd_ms
1.1.0-alpha or newer to cache a read-only query if explicitly allowed by setting an appropriate quality of
service through mysqlnd_ms_set_qos. P lease, see the quickstart for a code example. Both plugins
must be installed, PECL/mysqlnd_ms must be compiled to support the cache feature and PHP 5.4.0 or
newer has to be used.
Applications have full control of cache usage and can request fresh data at any time, if need be. The
cache usage can be enabled and disabled time during the execution of a script. The cache will be used
if mysqlnd_ms_set_qos sets the quality of service to eventual consistency and enables cache usage.
Cache usage is disabled by requesting higher consistency levels, for example, session consistency (read
your writes). Once the quality of service has been relaxed to eventual consistency the cache can be used
If caching is enabled for a read-only statement, PECL/mysqlnd_ms may inject SQL hints to control
caching by PECL/mysqlnd_qc. It may modify the SQL statement it got from the application. Subsequent
SQL processors are supposed to ignore the SQL hints. A SQL hint is a SQL comment. Comments must
not be ignored, for example, by the database server.
The TTL of a cache entry is computed on a per statement basis. Applications set an maximum age for the
data they want to retrieve using mysqlnd_ms_set_qos. The age sets an approximate upper limit of how
many seconds the data returned may lag behind the master.
The following logic is used to compute the actual TTL if caching is enabled. The logic takes the estimated
slave lag into account for choosing a TTL. If, for example, there are two slaves lagging 5 and 10 seconds
behind and the maximum age allowed is 60 seconds, the TTL is set to 50 seconds. Please note, the age
setting is no more than an estimated guess.
• Check whether the statement is read-only. If not, don't cache.
• If caching is enabled, check the slave lag of all configured slaves. Establish slave connections if none
exist so far and lazy connections are used.
• Send SHOW SLAVE STATUS to all slaves. Do not wait for the first slave to reply before sending to the
second slave. Clients often wait long for replies, thus we send out all requests in a burst before fetching
in a second stage.
• Loop over all slaves. For every slave wait for its reply. Do not start checking another slave
before the currently waited for slave has replied. Check for Slave_IO_Running=Yes and
VB.NET PDF Text Extract Library: extract text content from PDF
With this advanced PDF Add-On, developers are able to extract target text content from source PDF document and save extracted text to other file formats
convert word doc to pdf with editable fields; adding form fields to pdf files
C# PDF Text Extract Library: extract text content from PDF file in
How to C#: Extract Text Content from PDF File. Add necessary references: RasterEdge.Imaging.Basic.dll. RasterEdge.Imaging.Basic.Codec.dll.
add image field to pdf form; add text fields to pdf
Supported clusters
Slave_SQL_Running=Yes. If both conditions hold true, fetch the value of Seconds_Behind_Master.
In case of any errors or if conditions fail, set an error on the slave connection. Skip any such slave
connection for the rest of connection filtering.
• Search for the maximum value of Seconds_Behind_Master from all slaves that passed the previous
conditions. Subtract the value from the maximum age provided by the user with mysqlnd_ms_set_qos.
Use the result as a TTL.
• The filtering may sort out all slaves. If so, the maximum age is used as TTL, because the maximum lag
found equals zero. It is perfectly valid to sort out all slaves. In the following it is up to subsequent filter to
decide what to do. The built-in load balancing filter will pick the master.
• Inject the appropriate SQL hints to enable caching by PECL/mysqlnd_qc.
• Proceed with the connection filtering, e.g. apply load balancing rules to pick a slave.
• PECL/mysqlnd_qc is loaded after PECL/mysqlnd_ms by PHP. Thus, it will see all query modifications
of PECL/mysqlnd_ms and cache the query if instructed to do so.
The algorithm may seem expensive. SHOW SLAVE STATUS is a very fast operation. Given a sufficient
number of requests and cache hits per second the cost of checking the slaves lag can easily outweigh the
costs of the cache decision.
Suggestions on a better algorithm are always welcome.
7.5.13 Supported clusters
Copyright 1997-2014 the PHP Documentation Group.
Any application using any kind of MySQL cluster is faced with the same tasks:
• Identify nodes capable of executing a given statement with the required service level
• Load balance requests within the list of candidates
• Automatic fail over within candidates, if needed
The plugin is optimized for fulfilling these tasks in the context of a classical asynchronous MySQL
replication cluster consisting of a single master and many slaves (primary copy). When using classical,
asynchronous MySQL replication all of the above listed tasks need to be mastered at the client side.
Other types of MySQL cluster may have lower requirements on the application side. For example, if all
nodes in the cluster can answer read and write requests, no read-write splitting needs to be done (multi-
master, update-all). If all nodes in the cluster are synchronous, they automatically provide the highest
possible quality of service which makes choosing a node easier. In this case, the plugin may serve the
application after some reconfiguration to disable certain features, such as built-in read-write splitting.
Documentation focus
The documentation focusses describing the use of the plugin with classical
asynchronous MySQL replication clusters (primary copy). Support for this kind
of cluster has been the original development goal. Use of other clusters is briefly
described below. Please note, that this is still work in progress.
Primary copy (MySQL Replication)
This is the primary use case of the plugin. Follow the hints given in the descriptions of each feature.
VB.NET PDF Password Library: add, remove, edit PDF file password
VB: Add Password to PDF with Permission Settings Applied. This VB.NET example shows how to add PDF file password with access permission setting.
adding text field to pdf; changing font size in pdf form
C# PDF Password Library: add, remove, edit PDF file password in C#
C# Sample Code: Add Password to PDF with Permission Settings Applied in C#.NET. This example shows how to add PDF file password with access permission setting.
create a fillable pdf form; create a form in pdf from word
Supported clusters
• Configure one master and one or more slaves. Server configuration details are given in the setup
• Use random load balancing policy together with the sticky flag.
• If you do not plan to use the service level API calls, add the master on write flag.
• Please, make yourself aware of the properties of automatic failover before adding a failover directive.
• Consider the use of trx_stickiness to execute transactions on the primary only. Please, read carefully
how it works before you rely on it.
Example 7.51 Enabling the plugin (php.ini)
Example 7.52 Basic plugin configuration (mysqlnd_ms_plugin.ini) for MySQL Replication
"myapp": {
"master": {
"master_1": {
"host": "localhost",
"socket": "\/tmp\/mysql57.sock"
"slave": {
"slave_0": {
"host": "",
"port": 3308
"slave_1": {
"host": "",
"port": 3306
"filters": {
"random": {
"sticky": "1"
Primary copy with multi primaries (MMM - MySQL Multi Master)
MySQL Replication allows you to create cluster topologies with multiple masters (primaries). Write-write
conflicts are not handled by the replication system. This is no update anywhere setup. Thus, data must be
partitioned manually and clients must redirected in accordance to the partitioning rules. The recommended
setup is equal to the sharding setup below.
Manual sharding, possibly combined with primary copy and multiple primaries
Use SQL hints and the node group filter for clusters that use data partitioning but leave query redirection to
the client. The example configuration shows a multi master setup with two shards.
VB.NET PDF Text Add Library: add, delete, edit PDF text in vb.net
Data: Auto Fill-in Field Data. Field: Insert, Delete, Update Field. Redact Text Content. Redact Images. Redact Pages. Annotation & Drawing. Add Sticky Note.
add email button to pdf form; add form fields to pdf
C# PDF Text Add Library: add, delete, edit PDF text in C#.net, ASP
Data: Auto Fill-in Field Data. Field: Insert, Delete, Update Field. Redact Text Content. Redact Images. Redact Pages. Annotation & Drawing. Add Sticky Note.
adding an image to a pdf form; create a pdf form that can be filled out
Supported clusters
Example 7.53 Multiple primaries - multi master (php.ini)
Example 7.54 Primary copy with multiple primaries and paritioning
"myapp": {
"master": {
"master_1": {
"host": "localhost",
"socket": "\/tmp\/mysql57.sock"
"master_2": {
"host": "",
"socket": "3306"
"slave": {
"slave_1": {
"host": "",
"port": 3308
"slave_2": {
"host": "",
"port": 3306
"filters": {
"node_groups": {
"Partition_A" : {
"master": ["master_1"],
"slave": ["slave_1"]
"Partition_B" : {
"master": ["master_2"],
"slave": ["slave_2"]
"roundrobin": []
The plugin can also be used with a loose collection of unrelated shards. For such a cluster, configure
masters only and disable read write splitting. The nodes of such a cluster are called masters in the plugin
configuration as they accept both reads and writes for their partition.
Using synchronous update everywhere clusters such as MySQL Cluster
MySQL Cluster is a synchronous cluster solution. All cluster nodes accept read and write requests. In the
context of the plugin, all nodes shall be considered as masters.
Use the load balancing and fail over features only.
Supported clusters
• Disable the plugins built-in read-write splitting.
• Configure masters only.
• Consider random once load balancing strategy, which is the plugins default. If random once is used, only
masters are configured and no SQL hints are used to force using a certain node, no connection switches
will happen for the duration of a web request. Thus, no special handling is required for transactions. The
plugin will pick one master at the beginning of the PHP script and use it until the script terminates.
• Do not set the quality of service. All nodes have all the data. This automatically gives you the highest
possible service quality (strong consistency).
• Do not enable client-side global transaction injection. It is neither required to help with server-side fail
over nor to assist the quality of service filter choosing an appropriate node.
Disabling built-in read-write splitting.
• Set mysqlnd_ms.disable_rw_split=1
• Do not use SQL hints to enforce the use of slaves
Configure masters only.
• Set mysqlnd_ms.multi_master=1.
• Do not configure any slaves.
• Set failover=loop_before_master in the plugins configuration file to avoid warnings about the
empty slave list and to make the failover logic loop over all configured masters before emitting an error.
Please, note the warnings about automatic failover given in the previous sections.
Example 7.55 Multiple primaries - multi master (php.ini)
Example 7.56 Synchronous update anywhere cluster
"myapp": {
"master": {
"master_1": {
"host": "localhost",
"socket": "\/tmp\/mysql57.sock"
"master_2": {
"host": "",
"port": 3306
"slave": {
XA/Distributed transactions
"filters": {
"roundrobin": {
"failover": {
"strategy": "loop_before_master",
"remember_failed": true
If running an update everywhere cluster that has no built-in partitioning to avoid hot spots and high collision
rates, consider using the node groups filter to keep updates on a frequently accessed table on one of the
nodes. This may help to reduce collision rates and thus improve performance.
7.5.14 XA/Distributed transactions
Copyright 1997-2014 the PHP Documentation Group.
Version requirement
XA related functions have been introduced in PECL/mysqlnd_ms version 1.6.0-
Early adaptors wanted
The feature is currently under development. There may be issues and/or feature
limitations. Do not use in production environments, although early lab tests indicate
reasonable quality.
Please, contact the development team if you are interested in this feature. We are
looking for real life feedback to complement the feature.
Below is a list of some feature restrictions.
• The feature is not yet compatible with the MySQL Fabric support . This limitation
is soon to be lifted.
XA transaction identifier are currently restricted to numbers. This limitation will be
lifted upon request, it is a simplification used during the initial implementation.
MySQL server restrictions
The XA support by the MySQL server has some restrictions. Most noteably, the
servers binary log may lack changes made by XA transactions in case of certain
errors. Please, see the MySQL manual for details.
XA/Distributed transactions can spawn multiple MySQL servers. Thus, they may seem like a perfect tool
for sharded MySQL clusters, for example, clusters managed with MySQL Fabric. PECL/mysqlnd_ms
hides most of the SQL commands to control XA transactions and performs automatic administrative tasks
in cases of errors, to provide the user with a comprehensive API. Users should setup the plugin carefully
and be well aware of server restrictions prior to using the feature.
Example 7.57 General pattern for XA transactions
XA/Distributed transactions
$mysqli = new mysqli("myapp", "username", "password", "database");
/* BEGIN */
mysqlnd_ms_xa_begin($mysqli, 1 /* xa id */);
/* run queries on various servers */
$mysqli->query("UPDATE some_table SET col_a = 1");
/* COMMIT */
mysqlnd_ms_xa_commit($link, 1);
XA transactions use the two-phase commit protocol. The two-phase commit protocol is a blocking protocol.
During the first phase participating servers begin a transaction and the client carries out its work. This
phase is followed by a second voting phase. During voting, the servers first make a firm promise that they
are ready to commit the work even in case of their possible unexpected failure. Should a server crash in
this phase, it will still recall the aborted transaction after recover and wait for the client to decide on whether
it shall be committed or rolled back.
Should a client that has initiated a global transaction crash after all the participating servers gave their
promise to be ready to commit, then the servers must wait for a decision. The servers are not allowed to
unilaterally decide on the transaction.
A client crash or disconnect from a participant, a server crash or server error during the fist phase of the
protocol is uncritical. In most cases, the server will forget about the XA transaction and its work is rolled
back. Additionally, the plugin tries to reach out to as many participants as it can to instruct the server
to roll back the work immediately. It is not possible to disable this implicit rollback carried out by PECL/
mysqlnd_ms in case of errors during the first phase of the protocol. This design decision has been made
to keep the implementation simple.
An error during the second phase of the commit protocol can develop into a more severe situation. The
servers will not forget about prepared but unfinished transactions in all cases. The plugin will not attempt
to solve these cases immediately but waits for optional background garbage collection to ensure progress
of the commit protocol. It is assumed that a solution will take significant time as it may include waiting for a
participating server to recover from a crash. This time span may be longer than a developer and end user
expects when trying to commit a global transaction with mysqlnd_ms_xa_commit. Thus, the function
returns with the unfinished global transaction still requiring attention. Please, be warned that at this point, it
is not yet clear whether the global transaction will be committed or rolled back later on.
Errors during the second phase can be ignored, handled by yourself or solved by the build-int garbage
collection logic. Ignoring them is not recommended as you may experience unfinished global transactions
on your servers that block resources virtually indefinitely. Handling the errors requires knowing the
participants, checking their state and issuing appropriate SQL commands on them. There are no user API
calls to expose this very information. You will have to configure a state store and make the plugin record its
actions in it to receive the desired facts.
Please, see the quickstart and related plugin configuration file settings for an example how to configure a
state. In addition to configuring a state store, you have to setup some SQL tables. The table definitions are
given in the description of the plugin configuration settings.
Setting up and configuring a state store is also a precondition for using the built-in garbage collection
for XA transactions that fail during the second commit phase. Recording information about ongoing XA
transactions is an unavoidable extra task. The extra task consists of updating the state store after each
and every operation that changes the state of the global transaction itself (started, committed, rolled back,
errors and aborts), the addition of participants (host, optionally user and password required to connect) and
any changes to a participants state. Please note, depending on configuration and your security policies,
these recordings may be considered sensitive. It is therefore recommended to restrict access to the state
store. Unless the state store itself becomes overloaded, writing the state information may contribute
noteworthy to the runtime but should overall be only a minor factor.
It is possible that the effort it takes to implement your own routines for handling XA transactions that failed
during the second commit phase exceeds the benefits of using the XA feature of PECL/mysqlnd_ms in
the first place. Thus, the manual focussed on using the built-on garbage collection only.
Garbage collection can be triggered manually or automatically in the background. You may want to call
mysqlnd_ms_xa_gc immediately after a commit failure to attempt to solve any failed but still open global
transactions as soon as possible. You may also decide to disable the automatic background garbage
collection, implement your own rule set for invoking the built-in garbage collection and trigger it when
By default the plugin will start the garbage collection with a certain probability in the extensions internal
RSHUTDOWN method. The request shutdown is called after your script finished. Whether the garbage
collection will be triggered is determined by computing a random value between 1...1000 and comparing
it with the configuration setting probability (default: 5). If the setting is greater or equal to the random
value, the garbage collection will be triggered.
Once started, the garbage collection acts upon up to max_transactions_per_run (default: 100) global
transactions recorded. Records include successfully finished but also unfinished XA transactions. Records
for successful transactions are removed and unfinished transactions are attempted to be solved. There
are no statistics that help you finding the right balance between keeping garbage collection runs short by
limiting the number of transactions considered per run and preventing the garbage collection to fall behind,
resulting in many records.
For each failed XA transaction the garbage collection makes max_retries (default: 5) attempts to finish
it. After that PECL/mysqlnd_ms gives up. There are two possible reasons for this. Either a participating
server crashed and has not become accessible again within max_retries invocations of the garbage
collection, or there is a situation that the built-in garbage collection cannot cope with. Likely, the latter
would be considered a bug. However, you can manually force more garbage collection runs calling
mysqlnd_ms_xa_gc with the appropriate parameter set. Should even those function runs fail to solve the
situation, then the problem must be solved by an operator.
The function mysqlnd_ms_get_stats provides some statistics on how many XA transactions have been
started, committed, failed or rolled back.
7.6 Installing/Configuring
Copyright 1997-2014 the PHP Documentation Group.
7.6.1 Requirements
Copyright 1997-2014 the PHP Documentation Group.
PHP 5.3.6 or newer. Some advanced functionality requires PHP 5.4.0 or newer.
The mysqlnd_ms replication and load balancing plugin supports all PHP applications and all available
PHP MySQL extensions (mysqli, mysql, PDO_MYSQL). The PHP MySQL extension must be configured to
use mysqlnd in order to be able to use the mysqlnd_ms plugin for mysqlnd.
Documents you may be interested
Documents you may be interested